NOIP2017棋盘(普及T3)

T3

题面传送门

开始想去DP,但是写完之后发现不满足DP的无后效性,真是gg

然后开始着手dfs+记忆化。貌似bfs也能跑?(话说我是不是押到题了,之前给四十五中出过一道类似于bfs的题)但感觉复杂度太大,会TLE

正解是将已经有色的格子向四个不同的方向搜索,未染色的就进行染色,之后再搜索

一定要注意边界的判断啊!

#include
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define inf 0x3f3f3f
using namespace std;
const int maxn=1006,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int n,m,x,y,opt,Map[maxn][maxn],f[maxn][maxn];
void dfs(int x,int y,int p){
    rep(i,0,3){
        int nowx=x+dx[i],nowy=y+dy[i];
        if(nowx>n||nowx<1||nowy>n||nowy<1)continue;
        if(~Map[nowx][nowy]){
            if((~Map[x][y]?Map[x][y]:p)==Map[nowx][nowy])
            {
                if(f[nowx][nowy]>f[x][y])f[nowx][nowy]=f[x][y],dfs(nowx,nowy,Map[nowx][nowy]);
            }
            else{
                if(f[nowx][nowy]>f[x][y]+1)f[nowx][nowy]=f[x][y]+1,dfs(nowx,nowy,Map[nowx][nowy]);
            }
        }
        else{
            if(Map[x][y]==-1)continue;
            else if(f[nowx][nowy]>=f[x][y]+2)f[nowx][nowy]=f[x][y]+2,dfs(nowx,nowy,Map[x][y]);
        }
    }
}
int main()
{
    mem(Map,-1);
    mem(f,inf);
    cin>>n>>m;
    rep(i,1,m){
        cin>>x>>y>>opt;
        Map[x][y]=opt;
    }
    f[1][1]=0;
    dfs(1,1,0);
    if(f[n][n]==1061109567)cout<<"-1\n";
    else cout<return 0;
}

你可能感兴趣的:(搜索,OI成长历程)