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=b
1b
2…b
8,其中b
i为相应摆法中第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 }