您的位置:首页 > 其它

uva 639

2015-08-09 21:00 337 查看
递归回溯,枚举图中的所有位置,判断当前点能否放车,如果放置,vis标记为1;(这里和八皇后问题不同,即使在同行或者同列,有墙间隔,依然可以放置小车)

判断能否放置的方法参考代码中的judge函数;

#include <cstdio>
#include <cstring>

using namespace std;
#define minn -0x3f3f3f3f
int n, _min;
int vis[5][5];
char g[5][5];

void init(){
memset(vis, 0, sizeof(vis));
_min = minn;
}

bool judge(int x, int y){
for(int i = x-1; i >= 0; --i){  //judge row:
if(g[i][y] == 'X')
break;
if(vis[i][y])
return true;
}
for(int i = y-1; i >= 0; --i){  //judge column
if(g[x][i] == 'X')
break;
if(vis[x][i])
return true;
}
for(int i = y+1; i < n; ++i){
if(g[x][i] == 'X')
break;
if(vis[x][i])
return true;
}
return false;
}

void dfs(int x, int y, int cnt){
for(int i = x; i < n; ++i){
for(int j = 0; j < n; ++j){
if(!vis[i][j] && g[i][j] == '.' && !judge(i, j)){  //判断能否放 rook;
vis[i][j] = 1;
dfs(i, j, cnt+1);
vis[i][j] = 0;    //回溯问题中,如果是全局变量大多要还原状态量(强调);
}
}
}
if(cnt > _min){
_min = cnt;
}
}

int main()
{
while(scanf("%d", &n) != EOF && n){
for(int i = 0; i < n; ++i){
scanf("%s", g[i]);
}
init();
dfs(0, 0, 0);
printf("%d\n", _min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: