#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;
}
}
}
做单片机的翻棋子游戏时的答案程序
最新推荐文章于 2021-05-22 14:34:49 发布