习题7-10 UVA 11214 Guarding the Chessboard (迭代加深搜索)

大体题意:

给你n × m 的棋盘  X代表敌人,问最少放几个皇后吃掉所有敌人。

思路:

类似八皇后问题,直接枚举放的皇后个数进行迭代加深搜索。

dfs(x,y,cur)x代表 行数,y代表列数,cur 代表当前第几个皇后,直到满足所有X都可以被吃即可!

注意 :

放皇后时要注意皇后可以不放在X上!

最多5个皇后,枚举到4即可!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10 + 5;
bool vis[4][3*maxn];
char mp[maxn][maxn];
int n,m;
int maxd,cnt;
bool dfs(int x,int y,int cur){
	if (cur == maxd){
		for (int i = 0; i < n; ++i){
			for (int j = 0; j < m; ++j)
				if (mp[i][j] == 'X' && !vis[0][i] && !vis[1][j] && !vis[2][i+j] && !vis[3][i-j+11])
					return false;
		}
		return true;
	}
	while(x < n){
		while(y < m){
				bool t1 = vis[0][x], t2 = vis[1][y], t3 = vis[2][x+y], t4 = vis[3][x-y+11];
				vis[0][x] = vis[1][y] = vis[2][x+y] = vis[3][x-y+11] = true;
				if(dfs(x+1,0,cur+1))return true;
				vis[0][x] = t1, vis[1][y] = t2, vis[2][x+y] = t3, vis[3][x-y+11] = t4;
			++y;
		}
		y = 0;
		x++;
	}
	return false;
}
int main(){
	while(scanf("%d",&n) == 1 && n){
		scanf("%d",&m);
		for (int i = 0; i < n; ++i)
			scanf("%s",mp[i]);
		for (maxd = 0; maxd < 5 ; ++maxd){
			memset(vis,0,sizeof(vis));
			if(dfs(0,0,0))break;
		}
		printf("Case %d: %d\n",++cnt,maxd);
	}
	return 0;
}


你可能感兴趣的:(搜索,C语言,迭代)