P3956 棋盘

这道搜索弄得我很难受。

第一,一定要看清楚题在写。第二,弄清楚判断条件;

首先图的大小是m*m不是n*m;

然后就是当前有颜色的点是不用变颜色的;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
int f[maxn][110];
int n,m;
int mp[maxn][110];
int ans=2147483647;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
void dfs(int x,int y,int sum,int flag)
{
    if(sum>=f[x][y]) return ;
    f[x][y]=sum;
    if(x==m&&y==m)
    {
        ans=min(ans,sum);
        return ;
    }
    for(int i=0;i<4;i++)
    {
        int fx=x+xx[i];
        int fy=y+yy[i];
        if(fx<1||fx>m||fy<1||fy>m) continue ;
        if(mp[fx][fy])
        {
            if(mp[fx][fy]==mp[x][y])
            {
                dfs(fx,fy,sum,0);
            }
            else dfs(fx,fy,sum+1,0);
        }
        else if(!flag)
        {
            mp[fx][fy]=mp[x][y];
            dfs(fx,fy,sum+2,1);
            mp[fx][fy]=0;
        }
    }
}
int main()
{
    memset(f,0x7f,sizeof(f));
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        if(z==1) mp[x][y]=1;
        else if(z==0) mp[x][y]=2;
    }
    dfs(1,1,0,0);
    if(ans==2147483647) printf("-1");
    else printf("%d",ans);
    return 0;
}
02-11 15:32