UVA639 Don't Get Rooked

UVA639 Don't Get Rooked

类似八皇后问题,不过中间多了障碍物。。

深搜回溯,标记放过的点,。然后利用标记的点进行判断能不能放入。

#include <stdio.h>
#include <string.h>

int n;
char map[10][10];
int vis[10][10];
int max;
void dfs(int num)
{
    if (max < num)
	max = num;
    for (int i = 1; i <= n ; i++)
	for (int j = 1; j <= n; j ++)
	{
	    int a, b;
	    a = i; b = j;
	    int judge = 0;
	    while (map[a][b] != 'X')
	    {
		if (vis[a][b] == 1)
		{
		    judge = 1;
		    break;
		}
		b ++;
	    }
	    a = i; b = j;
	    while (map[a][b] != 'X')
	    {
		if (vis[a][b] == 1)
		{
		    judge = 1;
		    break;
		}
		b --;
	    }
	    a = i; b = j;
	    while (map[a][b] != 'X')
	    {
		if (vis[a][b] == 1)
		{
		    judge = 1;
		    break;
		}
		a ++;
	    }
	    a = i; b = j;
	    while (map[a][b] != 'X')
	    {
		if (vis[a][b] == 1)
		{
		    judge = 1;
		    break;
		}
		a --;
	    }
	    if (map[i][j] == '.' && judge == 0)
	    {
		vis[i][j] = 1;
		dfs(num + 1);
		vis[i][j] = 0;
	    }
	}
}
int main()
{
    while (scanf("%d", &n) != EOF && n)
    {
	getchar();
	max = 0;
	memset(map, 'X', sizeof(map));
	memset(vis, 0, sizeof(vis));
	for (int i = 1; i <= n ; i ++)
	{
	    for (int j = 1; j <= n; j++)
	    {
		scanf("%c", &map[i][j]);
	    }
	    getchar();
	}
	dfs(0);
	printf("%d\n", max);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值