八皇后
- Description
- 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b
1b
2…b
8,其中b
i为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
- Input
- 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
- Output
- 输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
- Sample Input
2 1 92
- Sample Output
15863724 84136275
题解:回溯法的应用。注意判断对角线之前是否存在皇后的方法。
题目地址:http://bailian.openjudge.cn/practice/2754/
代码:1 #include<stdio.h> 2 #include<string.h> 3 #include<stdbool.h> 4 5 int i,j,n,m,num, 6 a[10],b[100][10]; 7 8 bool f[3][50]; 9 10 int 11 pre() 12 { 13 memset(f,1,sizeof(f)); 14 memset(a,0,sizeof(a)); 15 memset(b,0,sizeof(b)); 16 num=0; 17 return 0; 18 } 19 20 void 21 dfs(int x) 22 { 23 int i; 24 if(x==9) 25 { 26 num++; 27 for(i=1;i<=8;i++) 28 b[num][i]=a[i]; 29 } 30 31 for(i=1;i<=8;i++) 32 if (f[0][i]&&f[1][x+i]&&f[2][x-i+8]) 33 { 34 a[x]=i; 35 f[0][i]=f[1][x+i]=f[2][x-i+8]=0; 36 dfs(x+1); 37 f[0][i]=f[1][x+i]=f[2][x-i+8]=1; 38 } 39 } 40 41 int 42 main() 43 { 44 int cas,i; 45 scanf("%d",&cas); 46 pre(); 47 dfs(1); 48 while(cas--) 49 { 50 scanf("%d",&n); 51 for(i=1;i<=8;i++) 52 printf("%d",b[n][i]); 53 printf("\n"); 54 } 55 return 0; 56 }