poj1753Flip Game

背景:說實話,看到這道題的時候一點也不會,然後朋友說了用dfs做,雖然曾經學長講過dfs,但我沒有認真聽,所以還是一點也沒懂,然後百度了dfs,還是暈暈的,最後實在沒辦法,就看了朋友的代碼,這下才弄懂了什麼是dfs,我下面的代碼就是看了朋友的代碼後,憑藉記憶,用他的思路寫出來的。

思路:對於每個格子,他要麼被反轉0次,要麼1次,由於只有16個格子,所以他的總的情況有

所以採用dfs深度搜索,在時間上是不成問題的。

學習:dfs算法:深度優先搜索所遵循的搜索策略是儘可能“深”地搜索圖。在深度優先搜索中,對於最新發現的頂點,如果它還有以此爲起點而未探測到的邊,就沿此邊繼續漢下去。當結點v的所有邊都己被探尋過,搜索將回溯到發現結點v有那條邊的始結點。這一過程一直進行到已發現從源結點可達的所有結點爲止。如果還存在未被發現的結點,則選擇其中一個作爲源結點並重復以上過程,整個進程反覆進行直到所有結點都被發現爲止。

#include <stdio.h>
int q[5][5],ok=0;
int iswin(void)
{
    int k=q[0][0];
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            if(k!=q[i][j]) return 0;
    return 1;
}
void change(int i,int j)
{
    q[i][j]=!q[i][j];
    if(i-1>=0)   q[i-1][j]=!q[i-1][j];
    if(j-1>=0)   q[i][j-1]=!q[i][j-1];
    if(i+1<=3)   q[i+1][j]=!q[i+1][j];
    if(j+1<=3)   q[i][j+1]=!q[i][j+1];
}
void dfs(int m,int sum,int a,int b)
{
    if(ok) return;
    if(m==sum)
    {
        if(iswin()) {ok=1;printf("%d\n",sum);}
        else return;
    }
    else
    {
        for(int i=a;i<4;i++)
        {
            for(int j=b;j<4;j++)
            {
                change(i,j);
                if(j<3)  dfs(m+1,sum,i,j+1);
                if(j==3) dfs(m+1,sum,i+1,0);
                change(i,j);
            }
        }
        return;
    }
}
int main(void)
{
    char ch;
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            scanf("%c",&ch);
            if(j==3) getchar();
            q[i][j]=(ch=='b')?1:0;
        }
    if(iswin()) {printf("%d\n",0);return 0;}
    for(int k=1;k<=16;k++)
        dfs(0,k,0,0);
    if(!ok) printf("Impossible\n");
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章