枚举状态POJ1753-Flip Game(枚举)
在写这篇文章之前,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; }
参考链接:
http://blog.csdn.net/lyy289065406/article/details/6642595
文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”
---------------------------------
原创文章 By
枚举和状态
---------------------------------