POJ1753-Flip Game

題目鏈接:點擊打開鏈接

題目大意爲給出4*4的棋盤落有黑棋‘b'與白棋’w',每次翻轉可以將上下左右和它本身變爲另一種顏色,求最少反轉多少次可以將棋盤上的棋變爲全黑或者全白。

一步步的dfs。。。

//164K	204MS	
//C++	1297B
#include <cstdio>
int step,flag;
int map[4][4];
void turn (int i,int j)//反轉棋子
{
    map[i][j]=!map[i][j];
    if(i>0) map[i-1][j]=!map[i-1][j];
    if(i<3) map[i+1][j]=!map[i+1][j];
    if(j>0) map[i][j-1]=!map[i][j-1];
    if(j<3) map[i][j+1]=!map[i][j+1];
}
bool judge()//判斷是否一致
{
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(map[i][j]!=map[0][0])
                return 0;
        }
    }
    return 1;
}
void dfs(int i,int j,int dp)
{
    if(dp==step)                //搜索次數與次數一致時判斷
    {
        flag=judge();
        return;
    }
    if(flag||i==4) return;     //搜索完畢或者已經找到就退出
    turn(i,j);                   //搜索反轉之後的
    if(j<3) dfs(i,j+1,dp+1);     //一行一行的搜索
    else dfs(i+1,0,dp+1);
    turn(i,j);                  //搜索反轉之前的
    if(j<3) dfs(i,j+1,dp);
    else dfs(i+1,0,dp);
    return;
}
int main()
{
    int i,j;
    char c;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            scanf("%c",&c);
            if(c=='b') map[i][j]=1;
            else map[i][j]=0;
        }
        getchar();//吸收回車
    }
    for(step=0;step<=16;step++)
    {
        flag=0;
        dfs(0,0,0);
        if(flag)
            break;
    }
    if(flag)
        printf("%d\n",step);
    else
        printf("Impossible\n");
    return 0;
}


發佈了24 篇原創文章 · 獲贊 1 · 訪問量 4132
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章