📄 88.txt
字号:
解法1 采用8个循环依次试探的方法求解8皇后问题 。
main()
{
int s1,s2,s3,s4,s5,s6,s7,s8,i=0;
printf("s1 s2 s3 s4 s5 s6 s7 s8\n");
for(s1=1;s1<=8;s1++)
for(s2=1;s2<=8;s2++)
{ if (s2==s1-1||s2==s1+1||s2==s1)
continue; /* 如果与前面的棋子有冲突,则重新换一个位置 */
for(s3=1;s3<=8;s3++)
{ if (s3==s1-2||s3==s1+2||s3==s1
||s3==s2-1||s3==s2+1||s3==s2)
continue;
for(s4=1;s4<=8;s4++)
{ if (s4==s1-3||s4==s1+3||s4==s1
||s4==s2-2||s4==s2+2||s4==s2
||s4==s3-1||s4==s3+1||s4==s3)
continue;
for(s5=1;s5<=8;s5++)
{ if (s5==s1-4||s5==s1+4||s5==s1
||s5==s2-3||s5==s2+3||s5==s2
||s5==s3-2||s5==s3+2||s5==s3
||s5==s4-1||s5==s4+1||s5==s4)
continue;
for(s6=1;s6<=8;s6++)
{ if (s6==s1-5||s6==s1+5||s6==s1
||s6==s2-4||s6==s2+4||s6==s2
||s6==s3-3||s6==s3+3||s6==s3
||s6==s4-2||s6==s4+2||s6==s4
||s6==s5-1||s6==s5+1||s6==s5)
continue;
for(s7=1;s7<=8;s7++)
{ if (s7==s1-6||s7==s1+6||s7==s1
||s7==s2-5||s7==s2+5||s7==s2
||s7==s3-4||s7==s3+4||s7==s3
||s7==s4-3||s7==s4+3||s7==s4
||s7==s5-2||s7==s5+2||s7==s5
||s7==s6-1||s7==s6+1||s7==s6)
continue;
for(s8=1;s8<=8;s8++)
{ if (s8==s1-7||s8==s1+7||s8==s1
||s8==s2-6||s8==s2+6||s8==s2
||s8==s3-5||s8==s3+5||s8==s3
||s8==s4-4||s8==s4+4||s8==s4
||s8==s5-3||s8==s5+3||s8==s5
||s8==s6-2||s8==s6+2||s8==s6
||s8==s7-1||s8==s7+1||s8==s7)
continue;
printf("%d %d %d %d %d %d %d %d\n",s1,s2,s3,s4,s5,s6,s7,s8);
i=i+1;
}
}
}
}
}
}
}
printf("total time is %d\n",i);
}
以上程序的运行结果:
s1 s2 s3 s4 s5 s6 s7 s8
1 5 8 6 3 7 2 4
1 6 8 3 7 4 2 5
1 7 4 6 8 2 5 3
1 7 5 8 2 4 6 3
2 4 6 8 3 1 7 5
2 5 7 1 3 8 6 4
2 5 7 4 1 8 6 3
2 6 1 7 4 8 3 5
2 6 8 3 1 4 7 5
2 7 3 6 8 5 1 4
2 7 5 8 1 4 6 3
2 8 6 1 3 5 7 4
3 1 7 5 8 2 4 6
3 5 2 8 1 7 4 6
3 5 2 8 6 4 7 1
3 5 7 1 4 2 8 6
3 5 8 4 1 7 2 6
3 6 2 5 8 1 7 4
3 6 2 7 1 4 8 5
3 6 2 7 5 1 8 4
3 6 4 1 8 5 7 2
3 6 4 2 8 5 7 1
3 6 8 1 4 7 5 2
3 6 8 1 5 7 2 4
3 6 8 2 4 1 7 5
3 7 2 8 5 1 4 6
3 7 2 8 6 4 1 5
3 8 4 7 1 6 2 5
4 1 5 8 2 7 3 6
4 1 5 8 6 3 7 2
4 2 5 8 6 1 3 7
4 2 7 3 6 8 1 5
4 2 7 3 6 8 5 1
4 2 7 5 1 8 6 3
4 2 8 5 7 1 3 6
4 2 8 6 1 3 5 7
4 6 1 5 2 8 3 7
4 6 8 2 7 1 3 5
4 6 8 3 1 7 5 2
4 7 1 8 5 2 6 3
4 7 3 8 2 5 1 6
4 7 5 2 6 1 3 8
4 7 5 3 1 6 8 2
4 8 1 3 6 2 7 5
4 8 1 5 7 2 6 3
4 8 5 3 1 7 2 6
5 1 4 6 8 2 7 3
5 1 8 4 2 7 3 6
5 1 8 6 3 7 2 4
5 2 4 6 8 3 1 7
5 2 4 7 3 8 6 1
5 2 6 1 7 4 8 3
5 2 8 1 4 7 3 6
5 3 1 6 8 2 4 7
5 3 1 7 2 8 6 4
5 3 8 4 7 1 6 2
5 7 1 3 8 6 4 2
5 7 1 4 2 8 6 3
5 7 2 4 8 1 3 6
5 7 2 6 3 1 4 8
5 7 2 6 3 1 8 4
5 7 4 1 3 8 6 2
5 8 4 1 3 6 2 7
5 8 4 1 7 2 6 3
6 1 5 2 8 3 7 4
6 2 7 1 3 5 8 4
6 2 7 1 4 8 5 3
6 3 1 7 5 8 2 4
6 3 1 8 4 2 7 5
6 3 1 8 5 2 4 7
6 3 5 7 1 4 2 8
6 3 5 8 1 4 2 7
6 3 7 2 4 8 1 5
6 3 7 2 8 5 1 4
6 3 7 4 1 8 2 5
6 4 1 5 8 2 7 3
6 4 2 8 5 7 1 3
6 4 7 1 3 5 2 8
6 4 7 1 8 2 5 3
6 8 2 4 1 7 5 3
7 1 3 8 6 4 2 5
7 2 4 1 8 5 3 6
7 2 6 3 1 4 8 5
7 3 1 6 8 5 2 4
7 3 8 2 5 1 6 4
7 4 2 5 8 1 3 6
7 4 2 8 6 1 3 5
7 5 3 1 6 8 2 4
8 2 4 1 7 5 3 6
8 2 5 3 1 7 4 6
8 3 1 6 2 5 7 4
8 4 1 3 6 2 7 5
(共92种情况)
解法2 采用递归回溯法求解N皇后问题(N>3)
#include "math.h"
#define N 8 /* N的值可以自由设定(N>3),适用于N*N的棋盘 */
int counter=0;
main()
{ void trail();
int a[N+1];
trail(a,1);
}
void trail(int *p,int k)
{int i,j,m,flag;
if(k>N) { for(i=1;i<=N;i++)printf("%3d",p[i]);printf("%6d\n",++counter); }
else /* 求得合法布局并将其输出,同时统计合法布局总数 */
for(j=1;j<=N;j++)
{ p[k]=j,flag=0;
for(m=1;m<k;m++)
if( p[m]==p[k] || abs(p[k]-p[m])==abs(k-m) ) { flag=1;break; }
if(flag==0)trail(p,k+1);
} /* flag用作判断棋子是否冲突 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -