POJ-1321 棋盘问题 DFS
题目链接:https://vjudge.net/problem/POJ-1321
题意:
这道题目意思是说在给定棋盘上摆放棋子(#位置才能放棋子),要求两棋子间不能同行或者同列,问有几种可能的摆放方式。
分析:
这道题是求解可行方案数,常用的方法有BFS和DFS,因为只有将所有棋子全部摆放完毕才能确定一种方案,故DFS较为适合。
核心的实现思路是,用vis[]记录某一列是否被示用,用map[]记录期棋盘信息,每次从(0,0)开始搜索,按行搜索,判断某一位置是否可放,若可以则记录vis[此列]为1,并递归深度遍历dfs[现在所在行+1,列+1],当列位置>k时,说明棋子已全部成功摆放,则ans++。最后输出总的可能数ans。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #define inf 0x3fffffff const int maxn = 100; using namespace std; int map[maxn][maxn]; bool vis[maxn]; int n, k, ans = 0; void init() { memset(vis, false, sizeof(vis)); ans = 0; } void dfs(int x, int y) { if(y >= k) { ans++; return; } for(int i = x; i < n; i++) { for(int j = 0; j < n; j++) { if(!vis[j] &&map[i][j] == 0) { vis[j] = true; dfs(i+1, y+1); vis[j] = false; } } } } int main(void) { while(scanf("%d%d", &n, &k) == 2 && n != -1) { char c; init(); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { cin >> c; if(c == '#') map[i][j] = 0; else if(c == '.') map[i][j] = 1; } // getchar(); } dfs(0, 0); printf("%d\n", ans); } }