设为首页 加入收藏

TOP

uva 639 Don't Get Rooked 变形N皇后问题 暴力回溯
2015-11-21 01:27:55 】 浏览:3988
Tags:uva 639 Don' Get Rooked 变形 皇后 问题 暴力 回溯

题目:跟N皇后问题一样,不考虑对角冲突,但考虑墙的存在,只要中间有墙就不会

#include    
  
const int maxn = 5;  
char map[maxn][maxn];  
int ans, n;  
  
bool isok(int x, int y) {  
    for (int i = x + 1; i <= n && map[i][y] != 'X'; i++)  
        if(map[i][y] == '0')  
            return false;  
    for (int i = x - 1; i >= 1 && map[i][y] != 'X'; i--)  
        if(map[i][y] == '0')  
            return false;  
    for (int i = y; i <= n && map[x][i] != 'X'; i++)  
        if (map[x][i] == '0')  
            return false;  
    for (int i = y - 1; i >= 1 && map[x][i] != 'X'; i--)  
        if (map[x][i] == '0')  
            return false;  
    return true;  
}  
  
void dfs(int x, int y, int p) {  
    for (int i = 1; i <= n; i++)  
        for (int j = 1; j <= n; j++)  
            if (map[i][j] == '.' && isok(i, j)) {  
                map[i][j] = '0';  
                dfs(i, j, p + 1);  
                map[i][j] = '.';  
            }  
    if (ans < p)  
        ans = p;  
}  
  
int main() {  
    while (scanf("%d", &n) && n) {  
        gets(map[0]);  
        for (int i = 1; i <= n; i++)  
            gets(map[i] + 1);  
        ans = 0;  
        dfs(1, 1, 0);  
        printf("%d\n", ans);  
    }  
    return 0;  
}  

#include 

const int maxn = 5;
char map[maxn][maxn];
int ans, n;

bool isok(int x, int y) {
	for (int i = x + 1; i <= n && map[i][y] != 'X'; i++)
		if(map[i][y] == '0')
			return false;
	for (int i = x - 1; i >= 1 && map[i][y] != 'X'; i--)
		if(map[i][y] == '0')
			return false;
	for (int i = y; i <= n && map[x][i] != 'X'; i++)
		if (map[x][i] == '0')
			return false;
	for (int i = y - 1; i >= 1 && map[x][i] != 'X'; i--)
		if (map[x][i] == '0')
			return false;
	return true;
}

void dfs(int x, int y, int p) {
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (map[i][j] == '.' && isok(i, j)) {
				map[i][j] = '0';
				dfs(i, j, p + 1);
				map[i][j] = '.';
			}
	if (ans < p)
		ans = p;
}

int main() {
	while (scanf("%d", &n) && n) {
		gets(map[0]);
		for (int i = 1; i <= n; i++)
			gets(map[i] + 1);
		ans = 0;
		dfs(1, 1, 0);
		printf("%d\n", ans);
	}
	return 0;
}

冲突。

N皇后一行只能放一个,而这题不行,所以用全图暴力放棋,回溯dfs即可,题目最多就到4*4,范围很小。

刚开始考虑放一个棋子后就把其他不能放的地方标记下,然后再暴力,后来发现如果一个点重复标记在去标记时就会把点标成合法的,于是改用放棋子是进行检查,由于数据量小,也不会占用多少时间。

之后才想到,在标记时可以用累加的,去标记时再一个一个减下来即可。。。

代码:

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇POJ 2704 Pascal's Travels (.. 下一篇HDU1250:Hat's Fibonacci

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目