做单片机的翻棋子游戏时的答案程序

#include<iostream>
#include<string>    
using namespace std;

int map[17],ans,k,limt,way[8];

void fan(int i)           //翻转函数
{
	map[i]=!map[i];
	if(i%4!=1)	map[i-1]=!map[i-1];
	if(i%4!=0)  map[i+1]=!map[i+1];
	if(i>4) map[i-4]=!map[i-4];
	if(i<13) map[i+4]=!map[i+4];
}

int jude()                      //判断是否整个棋盘均为同一种颜色的函数
{
	int n1,n2,i,j;
	   
	for(i=1;i<=16;i++)
		if(map[i]!=0)
			return 0;
	return 1;
	

}

void dfs(int cur,int d)                       //cur指当前你转了几个棋子,d指你这次该从哪个棋子开始选
{

	if(jude()) {ans=cur;}                         //如果棋盘达到条件,给ans赋值
	if(17-d<limt-cur||cur+1>limt) return ;      //如果剩余的可选棋子比所需棋子少或者你已经转的棋子比上限大
	for(int i=d;i<=16&&ans==-1;i++)                  //从d开始选择该转的棋子。如果答案ans已经得到则退出循环
	{
		fan(i);//翻转棋子
		way[cur]=i;
		dfs(cur+1,i+1);                          //cur+1,同时i+1,即下一次应该从i+1的棋子开始选,避免重复
		fan(i);                       //记得翻回来
	}
}

int main()
{
	int i,j;                
	for(i=1;i<=16;i++)
		scanf("%d",&map[i]);
	ans=-1;                                 
	for(i=0;i<=16;i++)               
	{
		limt=i;                  //limt指上限,即你这次打算翻几个棋子
		dfs(0,1);
		if(ans!=-1)
		{
			printf("%d\n",ans);
			for(j=0;j<ans;j++)
				printf("%d ",way[j]);
			return 0;
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值