利用迭代加深搜索,枚举需要的皇后数量,进行搜索。
对于10 * 10 的棋盘,最多需要5个皇后就能攻击整个棋盘,当0~4个皇后都不能搜索成功,那么5就不用搜索,直接打印。
AC代码:
#include<cstdio> #include<cstring> const int maxn = 15; int vis[4][maxn << 1]; char G[maxn][maxn]; int n, m; bool guard(){ for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j){ if(G[i][j] != 'X') continue; if(vis[0][i] || vis [1][j] || vis[2][i + j] || vis[3][i - j + maxn]) continue; return false; } return true; } int maxd; //限制皇后数量 bool dfs(int x, int y, int d){ if(d == maxd) return guard(); for(int i = x; i < n; ++i){ for(int j = y; j < m; ++j) { int a = vis[0][i], b = vis[1][j], c = vis[2][i + j], e = vis[3][i - j + maxn]; vis[0][i] = vis[1][j] = vis[2][i + j] = vis[3][i - j + maxn] = 1; if(dfs(i, j + 1, d + 1)) return true; vis[0][i] = a, vis[1][j] = b, vis[2][i + j] = c, vis[3][i - j + maxn] = e; } y = 0; } return false; } int main(){ int kase = 1; while(scanf("%d", &n) == 1 && n){ scanf("%d", &m); memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; ++i) scanf("%s", G[i]); for(maxd = 0; maxd < 5; ++maxd){ if(dfs(0, 0, 0)) break; } printf("Case %d: %d\n", kase++, maxd); } return 0; }
如有不当之处欢迎指出!