Checker Challenge(dfs深度搜索 打印八皇后)
2014-08-08 21:45
567 查看
Judge Info
Memory Limit: 65536KBCase Time Limit: 3000MS
Time Limit: 3000MS
Judger: Number Only Judger
Description
Examine the 6x6 checkerboard below and note that the six checkers are arranged on the board so that one and only one is placed in each row and each column, and there is never more than one in any diagonal. (Diagonals run from southeast to northwest and southwestto northeast and include all diagonals, not just the major two.)
Column 1 2 3 4 5 6 ------------------------- 1 | | O | | | | | ------------------------- 2 | | | | O | | | ------------------------- 3 | | | | | | O | ------------------------- 4 | O | | | | | | ------------------------- 5 | | | O | | | | ------------------------- 6 | | | | | O | | -------------------------
The solution shown above is described by the sequence 2 4 6 1 3 5, which gives the column positions of the checkers for each row from 1 to 6:
ROW | 1 | 2 | 3 | 4 | 5 | 6 |
COLUMN | 2 | 4 | 6 | 1 | 3 | 5 |
in numerical order, as if the checker positions form the digits of a large number, and then a line with the total number of solutions.
Input
The first numbermeans how many test cases will followed. For every test case will be a single line that contains a single
integer N (6 <= N <= 13) that is the dimension of the N x N checkerboard.
Output
For each test cases, print the follow contains: The first three lines show the first three solutions found, presented as N numbers with a single space between them. The fourth line shows the total number of solutions found.Sample Input
1 6
Sample Output
2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4
把八皇后的所有情况打印出来
#include<iostream> using namespace std; int plc[13]; int plc_p; int map[13][13]; bool flag[13]; int n; int ans; void dfs() { if(plc_p==n) { ans++; if(ans<4) for(int i=0;i<n;i++) { if(i!=n-1) cout<<plc[i]+1<<" "; else cout<<plc[i]+1<<endl; } } for(int i=0;i<n;i++) { if((i!=0)&&flag[i-1]==0) break; if(flag[i]==0) { flag[i]=1; for(int j=0;j<n;j++) { if(map[i][j]==0) { for(int k=0;k<n;k++) map[k][j]++; for(int k=0;k<n;k++) map[i][k]++; int ii=i,jj=j; while(ii>-1&&jj>-1) map[ii--][jj--]++; ii=i,jj=j; while(ii<n&&jj<n) map[ii++][jj++]++; ii=i,jj=j; while(ii>-1&&jj<n) map[ii--][jj++]++; ii=i,jj=j; while(ii<n&&jj>-1) map[ii++][jj--]++; map[i][j]=1; plc[plc_p++]=j; dfs(); plc_p--; for(int k=0;k<n;k++) map[k][j]--; for(int k=0;k<n;k++) map[i][k]--; ii=i,jj=j; while(ii>-1&&jj>-1) map[ii--][jj--]--; ii=i,jj=j; while(ii<n&&jj<n) map[ii++][jj++]--; ii=i,jj=j; while(ii>-1&&jj<n) map[ii--][jj++]--; ii=i,jj=j; while(ii<n&&jj>-1) map[ii++][jj--]--; map[i][j]=0; } } flag[i]=0; } } } int main() { int t; cin>>t; while(t--) { cin>>n; for(int i=0;i<n;i++) int plc_p=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) map[i][j]=0; for(int i=0;i<n;i++) flag[i]=0; ans=0; dfs(); cout<<ans<<endl; } return 0; }
dfs的基本过程:
dfs()
判明终止条件
for全部物件
标记
dfs()
恢复
相关文章推荐
- 深度优先搜索DFS-C语言实现、思路/解析-简笔
- 深度优先搜索DFS(depth first search),拓扑排序
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索DFS
- DFS 深度优先搜索
- 深度优先搜索DFS——图邻接矩阵表示
- DFS深度优先搜索案例:马戏团叠罗汉
- dfs深度优先搜索 1~N 的排列理解dfs,抽象为n个数放n个盒子
- 深度搜索与回溯方法不同点 Difference between DFS and Backtracking
- hdu 4337 King Arthur's Knights【dfs 深度搜索】
- nyoj 部分和问题(深度优先搜索DFS)
- 深度优先搜索Depth-first search (DFS) for undirected graphs
- [SDUT](3469)深度优先搜索练习之神奇的矩环 ---DFS(图)
- ACM-POJ 1562 DFS 深度优先搜索
- ACM-ZOJ 2412 DFS 深度优先搜索
- 迷宫问题---深度搜索(dfs)
- 深度优先搜索——八皇后问题
- 数据结构和算法之图---图的遍历之深度搜索dfs
- DFS深度优先搜索模板
- DFS--深度优先搜索--图的邻接矩阵