木卫二计数法的超吊代码
我的解法就是不停的制造排列,然后通过排列匹配起始位置,打开计数器,然后计数器=第二个变量时,计算终止,打印信息。
该解法可以支持下面的条件
input:
1
8
1
output:
3 2 1
如:
input value 1:
6
input value 2:
8888888
input value 3:
1 3 2 4 6 5
2 5 6 4 8 10 1 7 9 3 11
请各位验证!!!
//-------------------------------------------------------------
int MAX_COUNT;
int sum=-1,OFFSET=0;
int arr0[100];//输入的数组
//交换元素位置
void switchpos(int * arr, int x, int y)
{
int tempv;
tempv = arr[x];
arr[x]=arr[y];
arr[y] = tempv;
}
//判断数组是否完全相等
int comparearr(int * arr1, int* arr2, int length)
{
for (int x=0;x<length;x++)
{
if (arr1[x]!=arr2[x])
{
return -1;
}
}
return 0;
}
//递归函数,主要是获取一个定长数组的所有排列的情况
bool getlist(int *intarr,int *arrhead,int n)
{
if (sum==OFFSET) return true;
int *arrtemp= new int[n];
int *headtemp= new int[MAX_COUNT];
for (int x=0;x<MAX_COUNT;x++)
headtemp[x]= arrhead[x];
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
for (int x=0;x<n;x++)
{
arrtemp[x]=intarr[x];
}
if (n>1)
{
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
for (int i=0;i<n;i++) //在循环中调用递归函数,每次循环将数组第一位依次和后面的每一位进行交换
{
if (i!=0)
{
switchpos(arrtemp,0,i);
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
else
{
sum++;
}
for (int x=0;x<n;x++)
{
headtemp[MAX_COUNT-n+x]= arrtemp[x];
}
if (sum==OFFSET)
{
for (int x=0;x<MAX_COUNT;x++)
cout<<headtemp[x]<<" ";
cout<<endl;
getchar();
return true;
}
}
headtemp[MAX_COUNT-n]= arrtemp[0];
getlist(arrtemp+1,headtemp, n-1);
if (sum==OFFSET) return true;
}
}
delete []arrtemp;
delete []headtemp;
return 0;
}
int main( void )
{
int overcount;
cout<<"input value 1:"<<endl;
cin>>MAX_COUNT;
cout<<"input value 2:"<<endl;
cin>>OFFSET;
cout<<"input value 3:"<<endl;
for (int i=0; i<MAX_COUNT; i++)
cin>>arr0[i];
int arr [100];//自动生成当前位数的初始顺序
int arrhead [100];
for (int i=0;i<MAX_COUNT;i++)
{
arr[i]= i+1;
arrhead[i]= i+1;
}
while (!getlist(arr,arrhead,MAX_COUNT))//循环调用递归函数比如:3个元素的判断完了还没有达到,则判断4个元素的
{
MAX_COUNT++;
if (sum>=0) sum++;
for (int i=0;i<MAX_COUNT;i++)
{
arr[i]= i+1;
arrhead[i]= i+1;
}
if (sum==OFFSET)
{
for (int i=0;i<MAX_COUNT;i++)
{
cout<<arr[i]<<"";
}
cout<<endl;
break;
}
}
getchar();
return 0;
}