poj-1321-棋盘问题-回溯
2013-01-24 16:48
232 查看
题意:
给你一个棋盘,#的地方可以放棋。*的地方不能放棋。让你把k个棋子放入这个棋盘上,
要求两个棋子之间不可以同行或者同列。
做法:
和八皇后的问题很像。不可以同行,那么每一行至多有一个棋子。
可以对棋子的方法进行回溯。从第一行往下放,放下一个棋子之后,
把棋子所在的列标记一下,然后接着在下一行放棋子。直至棋子放完。
注意:
主要注意一下回溯函数的结束标志。
给你一个棋盘,#的地方可以放棋。*的地方不能放棋。让你把k个棋子放入这个棋盘上,
要求两个棋子之间不可以同行或者同列。
做法:
和八皇后的问题很像。不可以同行,那么每一行至多有一个棋子。
可以对棋子的方法进行回溯。从第一行往下放,放下一个棋子之后,
把棋子所在的列标记一下,然后接着在下一行放棋子。直至棋子放完。
注意:
主要注意一下回溯函数的结束标志。
#include<iostream> #include<stdio.h> #include<string.h> #define mem(map) memset(map,0,sizeof(map)) using namespace std; int count; int n,k; int map[9][9]; int leny[9]; void dfs(int x,int y,int z) { int i,j; if(z==k) { count++; return ; } for(i=x+1;i<=n;i++) { for(j=1;j<=n;j++) { if(map[i][j]==1&&leny[j]==0) { leny[j]=1; dfs(i,j,z+1); leny[j]=0; } } } } int main() { int i,j; char str; while(scanf("%d%d%*c",&n,&k)&&(n+1||k+1)) { mem(map); mem(leny); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%c",&str); if(str=='#')map[i][j]=1; } getchar(); } count=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(map[i][j]==1) { leny[j]=1; dfs(i,j,1); leny[j]=0; } } } printf("%d\n",count); } return 0; }
相关文章推荐
- POJ 1321 棋盘问题 (DFS + 回溯)
- poj1321 棋盘问题 回溯
- POJ 1321 棋盘问题(深搜 \ 回溯)
- poj 1321 棋盘问题 (dfs 回溯)
- POJ 1321棋盘问题(简单搜索dfs回溯)
- Poj 1321 棋盘问题 【回溯、类N皇后】
- poj 1321 棋盘问题 dfs 回溯
- poj 1321 棋盘问题(回溯)
- POJ - 1321 棋盘问题(回溯 DFS)
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- poj 1321 棋盘问题 DFS+回溯 回溯学习
- POJ 1321 棋盘问题(DFS回溯)
- POJ_1321——棋盘问题,回溯+剪枝
- poj 1321 棋盘问题(DFS,回溯)
- POJ 1321 棋盘问题(dfs回溯)
- POJ 1321 棋盘问题 深搜+回溯
- poj 1321 棋盘问题(dfs,回溯)
- POJ——1321棋盘问题(DFS+回溯)
- POJ - 1321 棋盘问题 (DFS 回溯)
- POJ 1321----棋盘问题(dfs+回溯)