UVa 639 Don't Get Rooked

本文介绍了一种改进版的八皇后问题实现方法,通过深度优先搜索(DFS)算法求解棋盘上放置皇后数量的最大值。考虑到棋盘上的障碍物(墙),该程序检查每一位置的有效性并递归地寻找所有可能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此题跟八个皇后有些相似......只不过加了“墙”......要注意DFS参数设定

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=5;
int n,ans=0;
int map[MAXN][MAXN];
int vis[MAXN][MAXN];
bool ok(int x, int y)
{
	if(map[x][y] || vis[x][y])
		return false;
	for(int i=x-1; i>=0 && !map[i][y]; i--)	//判断列是否合法
		if(vis[i][y])
			return false;
	for(int i= y-1; i>=0 && !map[x][i]; i--)	//判断行是否合法
		if( vis[x][i])
			return false;
	return true;
}
void dfs(int x,int y, int num)
{
	if(x == n)
	{
		if(num >ans)
			ans=num;
		return;
	}
	if(ok(x, y))
	{
		vis[x][y] =1;
		if(y >= n-1)
			dfs(x+1, 0, num+1);
		else
			dfs(x, y+1, num+1);
		vis[x][y]=0;
	}//在这一定不能有else,不然无法遍历矩阵全部数据
	if(y >= n-1)
		dfs(x+1, 0, num);
	else
		dfs(x, y+1, num);
}
int main()
{
	char s[MAXN];
	while(scanf("%d", &n) != EOF && n)
	{
		memset(map, 0, sizeof(map));
		memset(vis, 0, sizeof(vis));
		for(int i=0; i<n; i++)
		{
			scanf("%s", s);
			for(int j=0; j<n; j++)
				if(s[j] == 'X')
					map[i][j]=1;
		}
		ans=0;
		dfs(0,0,0);
		printf("%d\n", ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值