Flip Game&&dfs

在这里插入图片描述
在这里插入图片描述
首先,英文题面,看着就很难受,翻译起来就更难受了T^T,第一次读题时足足翻译了半个多小时,翻译完后又和百度翻译对照了一下,有很多地方都翻译错了,心态爆炸,不但题不会做,题解也看不下去(莫名烦躁而感觉看不懂)。缓了一天才缓过来。。。
题目的意思是给出四行四列字符串,判断能否把所有的b换成w或把所有的w换成b
这个题是一个简单的dfs题,一共有十六个字符,只要用dfs不点判断各种情况后取出最小的答案即可。由于粗心,一个for循环里的"<“打成了”>",卡了好长时间T^T

代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char arr[10][10];
int ans=100;
bool right()                    //判断是否满足条件(完全转换)
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(arr[i][j]!=arr[0][0])
            {
                return false;
            }
        }
    }
    return true;
}

void mmp(int a,int b)                //转换字符,下面的dfs要用到
{
    if(a>=0||a<4||b>=0||b<4)
    {
        if(arr[a][b]=='w')
            arr[a][b]='b';
        else if(arr[a][b]=='b')
            arr[a][b]='w';
    }
    else return;
}
void dfs(int x,int y,int num)
{
    if(right())              //如果可以,更新答案为当前最小值
    {
        ans=min(ans,num);
        //cout<<ans<<endl;
        return;
    }
    if(x==4)
        return ;
    mmp(x,y);            //改变状态
    mmp(x+1,y);
    mmp(x,y-1);
    mmp(x-1,y);
    mmp(x,y+1);
    if(y==3)             //判断对当前行的下一列dfs还是对下一行的第一列dfs
    {
        dfs(x+1,0,num+1);
    }
    else
    {
        dfs(x,y+1,num+1);
    }
    mmp(x,y);          //回溯
    mmp(x+1,y);
    mmp(x,y-1);
    mmp(x-1,y);
    mmp(x,y+1);
    if(y==3)            //不转换并dfs
    {
        dfs(x+1,0,num);
    }
    else
    {
        dfs(x,y+1,num);
    }
}

int main()
{
    ans=100;
    for(int i=0;i<4;i++)                   //输入题目所给字符
    {
        for(int j=0;j<4;j++)
        {
            cin>>arr[i][j];
        }
    }
    dfs(0,0,0);               //进行dfs
    if(ans<=16)               //由于要转换的字符最多为十六个,说以只要ans<=16即为正确答案
    cout<<ans;
    else
        cout<<"Impossible";
    return 0;
}

菜是原罪T^T

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/89109758