POJ-1753-Flip Game

来源:互联网 发布:铁鹰行动 知乎 编辑:程序博客网 时间:2024/05/15 01:54

这道题目整整弄了一个下午,纠结啊。做完这道题目 我才发现原来我对于递归的理解是多么的差。

后来我在网上搜了搜,这道题目还得用dp思想,我晕。

我看那个POJ训练计划,这明明就是枚举嘛。。

做题思路:

这道题目的中一共有十六个棋子,每个棋子都有两种状态,翻和不翻。一共只有16个棋子,所以最多翻16次。

从翻一次,一直找到翻16次,找到就终止,没找到就是输出impossible;

#include<stdio.h>
int a[4][4];
void change(int x,int y)//建立函数改变此点的状态
{
if(x>=0&&x<=3&&y>=0&&y<=3)
a[x][y]=(a[x][y]+1)%2;
}
void chanes(int x)//建立函数求所需要改变的点
{
int i,j;
i=x/4;
j=x%4;
change(i,j);
change(i-1,j);
change(i+1,j);
change(i,j-1);
change(i,j+1);
}
int pan()//判断是否完成
{
int i,j;
int sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
sum+=a[i][j];
}
if(sum%16==0)
return 1;
else
return 0;
}
int sou (int x,int y,int n)
{
int i,j;
if(pan())return 1;
if(n==0)return 0;
for(i=x;i<4;i++)
for(j=y;j<4;j++)
{
chanes(i*4+j);//改变此点以及周围的值
if(j==3)
{
if(sou(i+1,0,n-1))
return 1;
}
else
{
if(sou(i,j+1,n-1))
return 1;
}
chanes(i*4+j);变回来
}
return 0;
}
int main()
{
int i,j,k;
int s[4][4];
char str[5];
for(i=0;i<4;i++)
{
gets(str);
for(j=0;j<4;j++)
{
if(str[j]=='b')
s[i][j]=1;
else
s[i][j]=0;
}
}
for(i=0;i<=16;i++)//从翻0下一直找到翻16下,寻找符合的情况
{
for(k=0;k<4;k++)
for(j=0;j<4;j++)
a[k][j]=s[k][j];
if(sou(0,0,i))
{
printf("%d\n",i);
break;
}
}
if(i==17)
printf("Impossible\n");
return 0;
}




原创粉丝点击