棋子翻转

2019-05-05  本文已影响0人  Vincy_ivy

Title

Think

可以将char类型储存为int类型,在判断是否棋子全翻时可通过其是否全为1或全为0来判断
递归自动回溯,不需要人为

代码

    #include<stdio.h>
    #include<iostream>
    using namespace std;
    int chess[4][4];
    int c=33;
    void build()
    {
        char c;
        int i,j;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
            {
                cin>>c;
                if(c=='a')
                    chess[i][j]=0;
                else
                    chess[i][j]=1;
        }
    }
    void turn(int x,int y)
    {
         if(x>=0&&x<=3&&y>=0&&y<=3)
            chess[x][y]=!chess[x][y];
    }
    void flip(int s)
    {
        int i=s/4;
        int j=s%4;
        turn(i,j);
        turn(i+1,j);
        turn(i,j+1);
        turn(i-1,j);
        turn(i,j-1);
    }
    int complete()
    {
        int i,j,s1=0;
        for(i=0;i<4;i++)
            for(j=0;j<4;j++)
                s1+=chess[i][j];
        if(s1%16)
           return 0;
        else
            return 1;
    }
    void dfs(int s,int b)
    {
         if(complete())
         {
           if(c>b)
               c=b;
            return;
         }
        if(s>=16)
            return;
        dfs(s+1,b);
        flip(s);
//这里不用s+1的 原因是为了turn的i和j更加准确
        dfs(s+1,b+1);
        flip(s);
    }
    int main()
    {
        build();
        dfs(0,0);
        if(c==33)
           printf("Impossible\n");
        else
            printf("%d\n",c);
        return 0;
    }
上一篇 下一篇

猜你喜欢

热点阅读