在写这篇文章之前,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;
}

 

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

--------------------------------- 原创文章 By
枚举和状态
---------------------------------