您的位置:首页 > 其它

枚举 POJ 1753 Flip Game

2015-03-27 16:16 399 查看
题目地址:http://poj.org/problem?id=1753

 /*
这题几乎和POJ 2965一样,DFS函数都不用修改
只要修改一下change规则。。。
注意:是否初始已经ok了要先判断
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <map>
#include <queue>
#include <vector>
using namespace std;

const int MAXN = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int a[5][5];
bool flag;

bool ok(void)
{
int tmp = a[1][1];
for (int i=1; i<=4; ++i)
{
for (int j=1; j<=4; ++j)
if (a[i][j] != tmp)    return false;
}

return true;
}

void change(int x, int y)
{
a[x][y] = !a[x][y];
if (x > 1)    a[x-1][y] = !a[x-1][y];
if (x < 4)    a[x+1][y] = !a[x+1][y];
if (y > 1)    a[x][y-1] = !a[x][y-1];
if (y < 4)    a[x][y+1] = !a[x][y+1];
}

void DFS(int x, int y, int num, int cnt)
{
if (num == cnt)
{
flag = ok ();
return ;
}
for (int i=x; i<=4; ++i)
{
int j;
if (i == x)    j = y + 1;
else    j = 1;
for (; j<=4; ++j)
{
change (i, j);
DFS (i, j, num+1, cnt);
if (flag)    return ;
change (i, j);
}
}
}

void work(void)
{
if (ok ())
{
printf ("%d\n", 0);        return ;
}
int cnt;
for (cnt=1; cnt<=16; ++cnt)        //最多16次,可以暴力枚举
{
flag = false;
DFS (1, 0, 0, cnt);
if (flag)    break;
}
(cnt <= 16) ? printf ("%d\n", cnt) : puts ("Impossible");
}

int main(void)        //POJ 1753 Flip Game
{
//freopen ("A.in", "r", stdin);

char ch;
for (int i=1; i<=4; ++i)
{
for (int j=1; j<=4; ++j)        //b-0 w-1
{
scanf ("%c", &ch);
a[i][j] = (ch == 'b') ? 0 : 1;
}
getchar ();
}

work ();

return 0;
}

/*
Impossible
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: