poj1965 The Pilots Brothers' refrigerator

开始没什么想法...一直想找到简单的方法不用遍历,或者减少遍历的东西和规则

然而并没有xswl

直接枚举加dfs加回溯,跑一边就完事了,记得最后是+1就好了

#pragma warning (disable:4996)
/*
coded by fgtmiao
time:2019/6/29
*/
#include<iostream>//dfs & 暴力
using namespace std;
int map[5][5];
pair<int, int>way[20];//临时的路径
pair<int, int>fin_way[20];//最终的路径
int minstep = 999;
void init()
{
	char z;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cin >> z;
			if (z == '+')
			{
				map[i][j] = 1;
			}
			else
			{
				map[i][j] = 0;

			}
		}
	}
}
void turn(int i, int j)
{
	for (int a = 0; a < 4; a++)
	{
		map[i][a] = 1 - map[i][a];
		map[a][j] = 1 - map[a][j];
	}
	map[i][j] = 1 - map[i][j];
}
bool over()//游戏结束

{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (map[i][j] == 1)
			{
				return false;
			}
		}
	}
	return true;
}
void dfs(int num,int turn_num)//遍历了num个,翻转了turn_num次
{
	if (over())
	{
		if (turn_num < minstep)
		{
			minstep = turn_num;
		}
		for (int i = 0; i < turn_num; i++)
		{
			fin_way[i] = way[i];
		}
		return;
	}
	if (num >= 16)return;//遍历数目超了

	turn(num / 4, num % 4);//下一个的行和列
	//记录当前路径
	way[turn_num] = make_pair(num / 4+1, num % 4+1);//人家是从一开始的...
	dfs(num + 1, turn_num + 1);
	turn(num / 4, num % 4);//回溯

	dfs(num + 1, turn_num);//不反转当前的

}
int main()
{
	init();
	dfs(0, 0);
	printf("%d\n", minstep);
	for (int i = 0; i < minstep; i++)
	{
		printf("%d %d\n", fin_way[i].first, fin_way[i].second);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值