Luogu P3956 棋盘 【NOIP2017 普及组】

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 2147483647
int m,n,x,y,c;
int M[110][110];
int f[110][110];
int Ans=INF;
bool vis[110][110];
int u[]={1,-1,0,0};
int v[]={0,0,1,-1};
void dfs(int x,int y,int cost,bool flag){
    //use F[i][j] to memorize the best solution on (i,j)
  if(x<1||x>m||y<1||y>m) return;
  if(cost>=f[x][y])return;
  f[x][y]=cost;
  if(x==m&&y==m){
    Ans=min(cost,Ans);
    return;
  }
  for(int i=0;i<4;i++){
    int nx=x+u[i],ny=y+v[i];
    if(M[nx][ny]){
      if(M[nx][ny]==M[x][y]) dfs(nx,ny,cost,0);
      else dfs(nx,ny,cost+1,0);
    }
    else if(!flag){
      M[nx][ny]=M[x][y];
      dfs(nx,ny,cost+2,1);
      M[nx][ny]=0;
    }
  }
  
  
}
int main(){
  cin>>m>>n;
  memset(f,127,sizeof(f));  //memset 是字符串语法不能直接全都赋值int初始化除了zero
  for(int i=1;i<=n;i++){
    cin>>x>>y>>c;
    M[x][y]=c+1; // 0 无色    1 黄色      2 红色
  }
  dfs(1,1,0,0);
  printf("%d\n",Ans==INF?-1:Ans);
  return 0;
}

posted @ 2020-02-07 10:50  KingBenQi  阅读(81)  评论(0编辑  收藏  举报