终于写完了,听说有92种排序方式,看了不少博客,看到这句话,看别人代码百遍,不如自己写一遍,然后看别人代码,太简洁,没看懂,还是自己写
写了好久,终于成功了,记得加油,下面这个图很魔性,写卡了的时候,可以看看图,继续写
#include <stdio.h>
int queen[9];
void print()//打印
{
int i,j;
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
if(queen[i]==j)
printf("%c ",2);//打印这个地方,我是模仿别人的打印方式,打印出来,还是蛮不错的,蛮人性化的
else
printf(". ");
printf("\n");
}
}
int check(int i)//判断时候合法
{
int j;
for(j=1;j<i;j++)
if(queen[j]==queen[i]||queen[j]-queen[i]==j-i||queen[j]-queen[i]==i-j)
return 0;
return 1;
}
int next(int i)//获得下一行合法位置
{
int j;
for(j=1;j<=8;j++)
{
queen[i]=j;
if(check(i)==1)
{
return j;
}
}
return 0;
}
int replace(int i)//在当前行寻找除去queen[i],也就是queen[i]+1~8之间的可选位置
{
int j;
if(queen[i]==8)
return 0;
for(j=queen[i]+1;j<=8;j++)
{
queen[i]=j;
if(check(i)==1)
return i;
}
return 0;
}
void Try(int i,int value)
{
queen[i]=value;
if(i==8)
{
print();
return;
}
/* int m,n;
for(m=1;m<=8;m++)
{
for(n=1;n<=8;n++)
if(queen[m]==n)
printf("* ");
else
printf("0 ");
printf("\n");
}*/
if(next(i+1)==0)//下一行没有合法位置
{
while(replace(i)==0)//当前行也无合法位置,则继续循环上一个合理位置//感觉这个地方,是最后才想好的,感觉很重要
{
i--;
replace(i);
}
Try(i,queen[i]);
}
else//下一行存在合法位置
Try(i+1,next(i+1));
}
int main()
{
int i;
for(i=1;i<=8;i++)
queen[i]=0;
Try(1,1);
return 0;
}
这只是第一种,以后再更新92种
-----------------------------
来个暴力的,虽然不好,但是他这种很轻便
void put(int n)
{
int i;
for(i=1;i<MAX;i++)
{
s[n]=i;
if(check(n))
{
if(n==MAX-1)
result();
else
put(n+1);
}
}
}