POJ1753Flip Game

据说是大模拟。。。用的IDADFS水过

加了个小剪枝,就是黑色和白色剩余的最少的数量加上当前的深度大于限制深度就可以return 了

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool m[6][6]={0};
char maps[6][6];
int lim;
int dx[5]={-1,1,0,0,0};
int dy[5]={0,0,-1,1,0};
void flip(int r,int c)
{
    for(int i=0;i<5;i++)
        m[r+dx[i]][c+dy[i]]=!m[r+dx[i]][c+dy[i]];
}
bool check()
{
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            if(m[i][j]!=m[1][1]) return 0;
    return 1;
}
bool cut(int x)
{
	int cnt=0,tot=0;
	for (int i=1;i<=4;i++)
	for (int k=1;k<=4;k++)
	if (m[i][k]=='w') cnt++;
	else tot++;
	return (min(tot,cnt)+x)<=lim;
}
int dfs(int row,int col,int limdep)
{
    if (limdep==lim) return check();
    if (row==5||!cut(limdep)) return 0;
    flip(row,col);int flag=0;
    if (col<4) flag=max(flag,dfs(row,col+1,limdep+1));
    else flag=max(flag,dfs(row+1,1,limdep+1));
    flip(row,col);
    if (col<4) flag=max(flag,dfs(row,col+1,limdep));
    else flag=max(flag,dfs(row+1,1,limdep));
    return flag;
}
int main()
{
    for (int i=1;i<=4;i++)
    {
        scanf("%s",maps[i]+1);
        for(int j=1;j<=4;j++)
            if(maps[i][j]=='b') m[i][j]=true;
    }
    for (lim=0;!dfs(1,1,0)&&lim<=16;lim++);
    if (lim<=16) printf("%d\n",lim);
    else printf("Impossible\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81117645