您的位置:首页 > 其它

枚举状态POJ1753-Flip Game(枚举)

2013-05-27 20:05 253 查看
在写这篇文章之前,xxx已经写过了几篇关于改枚举状态主题的文章,想要了解的朋友可以去翻一下之前的文章

http://poj.org/problem?id=1753

简略枚举。

每一个格子只有翻与不翻两种状态(翻两次跟没翻一样)。总共16个格子,最多只能翻出2^16种状态。

Code:

每日一道理

青春,有嬉笑声与哭泣声夹杂的年华,青春的少年是蓝天中翱翔的幼鹰,虽然没有完全长大,有些稚气,有些懵懂,脱不开父母的双手却极力想去找寻属于自己的一片天空,为的是一时的激情,为的是一种独自翱翔的感觉!

#include <stdio.h>

bool s[20][20];
int best;

int check()
{
int i, j, tot = 0;
for(i=0;i<4;i++) for(j=0;j<4;j++) tot +=s[i][j];
if(tot == 0 || tot == 16) return 1;
return 0;
}
void Echange(int x, int y)
{
s[x][y] = !s[x][y];
s[x+1][y] = !s[x+1][y];
s[x][y+1] = !s[x][y+1];
if(x>0) s[x-1][y] = !s[x-1][y];
if(y>0) s[x][y-1] = !s[x][y-1];

}
void Search(int k, int ans)
{
int x, y;
if(16 == k) {
if( check()&& ans <best) best = ans;
}else {
x = k /4;
y = k %4;
Search(k+1,ans);//不翻
Echange(x, y);
Search(k+1,ans+1);//翻
Echange(x, y);
}
}
void work()
{
int i, j;
char c;
for(i = 0; i<4; i++)
{
for(j = 0; j<4; j++){
scanf("%c", &c);
if(c=='w') s[i][j] = 0;
else s[i][j] = 1;
}
getchar();
}
//for(i=0;i<4;i++){for(j=0;j<4;j++) printf("%d",s[i][j]);printf("\n");}
best = 1000;
Search(0, 0);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
s[i][j] =!s[i][j];
Search(0, 0);
if(best != 1000) printf("%d\n",best);
else printf("Impossible\n");
}

int main()
{
work();
return 0;
}

参考链接:

/article/1968852.html

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。

“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。

“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。

“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。

“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。

  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

---------------------------------
原创文章 By
枚举和状态
---------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: