noi 1700 + 1756 八皇后问题 x

1700:八皇后问题

总时间限制: 
10000ms
 
内存限制: 
65536kB
描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入

样例输出
No. 1
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
No. 2
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 1 0 0 0 0 0 
No. 3
1 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
No. 4
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
No. 5
0 0 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
No. 6
0 0 0 1 0 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 7
0 0 0 0 1 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 8
0 0 1 0 0 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 9
0 0 0 0 1 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
...以下省略
提示
此题可使用函数递归调用的方法求解。
以下的代码真的真的6666
 1 #include<cstdio>
 2 #define s printf(
 3 #define h m[i][j]=x[j]=y[i+j]=z[i-j+10]=
 4 #define f(i) for(int i=0;i<8;i++)
 5 
 6 int m[9][9],c,k,l,x[9],y[9],z[50];
 7 
 8 int d(int i)
 9 {
10     if(i>7)
11     {
12         ++c;
13         s"No. %d\n",c);
14         f(k)
15         {
16             f(l)s"%d ",m[l][k]);
17             s"\n");
18         }
19     }
20     f(j)
21     {
22         if(!x[j]&&!y[i+j]&&!z[i-j+10])
23         {
24             h 1;
25             d(i+1);
26             h 0;
27         }
28     }
29 }
30 
31 int main()
32 {
33     d(0);
34 }

1756:八皇后

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
样例输入
2
1
92
样例输出
15863724
84136275
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<string>
 7 #include<cmath>
 8 
 9 using namespace std;
10 
11 bool d[100]= {0},b[100]= {0},c[100]= {0}; //b为行;c,d为对角线,c和,d差
12 int h=0,n,cs[99],a[100];
13 
14 int print() {
15     h++;
16     for(int j=1; j<=n; j++) {
17         if(h==cs[j]) {
18             j++;
19             for(int i=1; i<=8; i++) {
20                 cout<<a[i];
21             }
22             cout<<endl;
23         }
24     }
25 }
26 
27 int search(int i) {
28     int j;
29     for(j=1; j<=8; j++) {
30         if(!b[j]&&!c[i+j]&&!d[i-j+7]) {
31             a[i]=j;
32             b[j]=1;
33             c[i+j]=1;
34             d[i-j+7]=1;
35             if(i==8) print();
36             else search(i+1);
37             b[j]=0;
38             c[i+j]=0;
39             d[i-j+7]=0;
40         }
41     }
42 }
43 
44 int main() {
45     cin>>n;
46     for(int i=1; i<=n; i++) {
47         cin>>cs[i];
48     }
49     search(1);//从第1个皇后开始放置
50     return 0;
51 }

还有n皇后问题:http://www.cnblogs.com/zxqxwnngztxx/p/6612746.html

posted @ 2017-04-24 20:28  夜雨声不烦  阅读(340)  评论(0编辑  收藏  举报