利用迭代加深搜索,枚举需要的皇后数量,进行搜索。
对于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;
}
如有不当之处欢迎指出!