原題傳送門ios
這是一道經典深搜題,難度適中,屬於那種我剛開始沒思路,但思考一會總能作出來的那種最適合個人難度,很不錯。
這道題是NOIP2017普及組T3,比起NOIP2018普及組的毒瘤T3不知道好了多少倍QAQ。spa
#include<iostream> #include<cstdio> #include<string> #include<vector> #include<algorithm> #include<cstdlib> #include<cmath> #include<stack> #include<map> using namespace std; int M,N,ans=99999999,x,y,c,m[105][105],f[105][105]; const int nextx[5]={0,-1,1,0,0}; const int nexty[5]={0,0,0,-1,1}; void dfs(int x,int y,int cost,int flag) { if(x<1||y<1||x>M||y>M)return; if(cost>=f[x][y])return; f[x][y]=cost; if(x==M&&y==M) { ans=min(ans,cost); return; } for(int k=1;k<=4;k++) { int tx=x+nextx[k]; int ty=y+nexty[k]; //若同色 if(m[tx][ty]==m[x][y]&&m[tx][ty]!=-1) { dfs(tx,ty,cost,0); } //若不一樣色 if(m[tx][ty]!=m[x][y]&&m[tx][ty]!=-1) { dfs(tx,ty,cost+1,0); } //若無色 if(m[tx][ty]==-1) { if(flag==0) { m[tx][ty]=m[x][y]; dfs(tx,ty,cost+2,1); m[tx][ty]=-1; } } } } int main() { cin>>M>>N; for(int i=1;i<=M;i++) { for(int j=1;j<=M;j++) { m[i][j]=-1; f[i][j]=99999999; } } for(int i=1;i<=N;i++) { cin>>x>>y>>c; m[x][y]=c; } dfs(1,1,0,0); if(ans==99999999) cout<<-1; else cout<<ans; return 0; }