uva11214 Guarding the Chessboard 迭代深搜+数组表示方向状态+回溯

题意:给出n*m的棋盘,上面被标记‘X’的地方需要放置皇后来保护,问最少需要几个皇后能保护所有的‘X’型区域。注:1.皇后可以放置在任何'.'或者‘X’上 2.皇后保护自己所在的这一列,这一行,左右斜对角线方向上的所有格子。

思路:1. 因为深度不确定,放置不确定,直接搜素数据量太大,所以这里采用迭代加深搜索+回溯,限定每次搜索的深度从而限定时间,防止盲目搜索带来的时间浪费,而且这里限制的深度就是放置皇后的个数。

2.这里每放置一个皇后,就能保护自己这一行,这一列,这两斜的对角线方向。所以我们这里以标记方向状态为标记数组。打破了传统的标记坐标状态从而大大减少了时间。vis[4][maxn]来标记方向行,方向列,方向左斜,方向右斜。

vis[0][i]标记i行被保护。

vis[1][j]标记j列被保护。

vis[2][i+j]标记(i,j)左斜对角线方向被标记(这一对角线上x+y全为i+j)。

vis[3][maxn+i-j]标记右斜对角线方向被标记(这一对角线上x-y全为i-j但会出现负数,所以加上maxn变为正数)。

实在是妙!

3.到达maxed层后,‘X’全部被保护的条件是,每个'X'至少有一个方向vis被标记也就是被保护。

代码:

#include 
#include
#include
#include
#include
using namespace std;
const int maxn = 11;
int n,m,maxed;
int maps[10][10];
bool vis[4][2*maxn];
bool judge(){//判断‘X'四个方向是否都被保护
    for(int i = 0;i

你可能感兴趣的:(uva11214 Guarding the Chessboard 迭代深搜+数组表示方向状态+回溯)