画家问题

本文介绍了一种基于回溯法的迷宫求解算法,通过枚举和猜测的方法来确定迷宫中可行走路径,实现了从起点到终点的正确路径寻找。文章详细展示了算法的具体实现过程,包括初始化迷宫状态、定义状态转移方程、判断失败条件等关键步骤。

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

<span style="font-family: Arial, Helvetica, sans-serif;">#include <cstdlib></span>
#include <cstdio>
#include <iostream>
using namespace std;

#pragma warning(disable:4996)

int puzzle[20][20];
int press[20][20];
int n;

void enumate();
bool guess();
bool failed();

int main()
{
	int cases, r, c, count;
	scanf("%d", &cases);
	for (int j = 0; j < cases;j++)
	{
		count = 0;
		scanf("%d", &n);
		for (r = 0; r < n + 1; r++)
		{
			press[r][0] = press[r][n + 1] = 0;
		}
		for (c = 1; c < n + 1; c++)
			press[0][c] = 0;

		char a;

		for (r = 1; r < n + 1;r++)
		for (c = 1; c < n + 1; c++)
		{
			//scanf("%c", &a);
			cin >> a;
			//cout << a << endl;
			if (a == 'y')
				puzzle[r][c] = 0;
			else if (a == 'w')
				puzzle[r][c] = 1;
		}

		enumate();

		if (failed() && n > 1)//只有一组数据时会出错
			printf("inf\n");
		else
		{
			for (r = 1; r < n + 1; r++)
			{
				for (c = 1; c < n + 1; c++)
				{
					if (press[r][c] == 1)
						count++;
				}
			}
			printf("%d\n", count);
		}
	}
	return 0;
}

void enumate()
{
	int c;
	for (c = 1; c < n + 1; c++)
		press[1][c] = 0;
	while (guess() == false)
	{
		if (failed())
			break;
		press[1][1]++;
		c = 1;
		while (press[1][c]>1)
		{
			press[1][c] = 0;
			c++;
			press[1][c]++;
		}
	}
	return;
}

bool guess()
{
	int c, r;
	for (r = 1; r < n;r++)
	for (c = 1; c < n + 1; c++)
		press[r + 1][c] = (puzzle[r][c] + press[r][c] + press[r - 1][c] + press[r][c - 1] + press[r][c + 1]) % 2;

	for (c = 1; c < n + 1;c++)
	if ((press[n][c - 1] + press[n][c] + press[n][c + 1] + press[n - 1][c]) % 2 != puzzle[n][c])
		return false;
	return true;
}

inline bool failed()
{ 
	int c;
	bool failure = true;
	for (c = 1; c < n + 1;c++)
	if (press[1][c] == 0)
		failure = false;

	return failure;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值