搜索棋盘 luogu-3956

Posted dawn-star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索棋盘 luogu-3956相关的知识,希望对你有一定的参考价值。

分析

按照这个题目随便写一个搜索就可以了

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctype.h>
#include <iostream>

using namespace std;

const int dx[4]={-1,0,1,0};
const int dy[4]={0,-1,0,1};
const int inf=1<<30;

int a[105][105],color[105][105],f[105][105];
int m,n,ans;

inline int read() {
    int x=0,w=0;char ch=0;
    while (!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while (isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return w?-x:x;
}

void dfs(int x,int y,bool flag,int sum) {
    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 nx=x+dx[i],ny=y+dy[i];
        if (nx<1||nx>m||ny<1||ny>m) continue;
        if (color[nx][ny]==-1) {
            if (flag) {
                color[nx][ny]=color[x][y];
                dfs(nx,ny,0,sum+2);
                color[nx][ny]=-1;
            }
        }
        else {
            if (color[nx][ny]==color[x][y]) dfs(nx,ny,1,sum);
            else dfs(nx,ny,1,sum+1);
        }
    }
}

int main() {
    m=read(),n=read();
    for (int i=1;i<=m;i++) for (int j=1;j<=m;j++) color[i][j]=-1,f[i][j]=inf;
    for (int i=1;i<=n;i++) {
        int x=read(),y=read(),c=read();
        color[x][y]=c;
    }
    ans=inf;
    dfs(1,1,1,0);
    if (ans==inf) printf("-1
");
    else printf("%d
",ans);
    return 0;
}

以上是关于搜索棋盘 luogu-3956的主要内容,如果未能解决你的问题,请参考以下文章

1321:棋盘问题(深度优先搜索进阶)

奇妙的棋盘(建图+神仙搜索)

poj 1191 棋盘切割 (压缩dp+记忆化搜索)

马踏棋盘(骑士周游问题)

POJ 1191 棋盘分割 (区间DP,记忆化搜索)

棋盘分割(记忆化搜索)