和12楼16楼的基本想法查不多,但由于可能的顺序太多,如果不找到特殊的规律算法复杂度就是N!量级。算到12后就很慢了。
很多数没有解.
恩..12楼的其实也是穷举法.昨天我做了..也不比我的少几个for
如果象你说的那样..5.6 9.10等..无解的话
那么 feng1256 昨天告诉我的规律就是对的..这下得研究下了..
[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
呵呵,厉害啊,我回去做了一下,也是用穷举的.却出错了...
#include <stdio.h>
#define N 3
int a[2*N]={0};
int b[N+1]={0};
void dosort(int k)
{
int i;
if(k<N)
for(i=1;i<N+1;i++)
{
if(b[i]==0&&a[k]==0&&a[k+i+1]==0&&k+i+1<2*N)
{
b[i]=1;
a[k]=a[k+i+1]=i;
dosort(k+1);
b[i]=a[k]=a[k+i+1]=0;
}
}
if(k==N)
{
for(i=0;i<2*N;i++)
printf("%5d",a[i]);
printf("\n");
}
}
int main()
{
dosort(0);
getch();
}
谁可以告诉我错哪了?
#include <stdio.h>
#define N 3
int a[2*N]={0}; /*初始为0,用来存储数组*/
int b[N+1]={0}; /*数组用来标记检查,如,b[3]=1,表示3这个数已经被用在数组a[]中,如果为0表示还没有被用到排列中*/
void dosort(int k)
{
int i;
if(k<N)
for(i=1;i<N+1;i++)
{
if(b[i]==0&&a[k]==0&&a[k+i+1]==0&&k+i+1<2*N) /*如果数i没被用且a[k]和a[k+i+1]这个位置还没被占据,同时下标不能越界*/
{
b[i]=1; /*标记i,表示i已经被用了*/
a[k]=a[k+i+1]=i; /*填入数i,两者距离为i+1*/
dosort(k+1); /*继续递归*/
b[i]=a[k]=a[k+i+1]=0; /*恢复原始值,以便进入下一重循环*/
}
}
if(k==N) /*此时数已经全部填充完,输出*/
{
for(i=0;i<2*N;i++)
printf("%5d",a[i]);
printf("\n");
}
}
int main()
{
dosort(0);
getch();
}
谁可以告诉我错哪了?