助求蒻蒟

P3956 [NOIP2017 普及组] 棋盘

```cpp #include<bits/stdc++.h> using namespace std; int n,m,a[101][101],flag[101][101],f[101][101]; //a[i][j]颜色flag[i][j]本色还是变色f[x][y]记忆数组 int dx[5]={0,0,1,0,-1}; int dy[5]={0,1,0,-1,0}; int x,y,w; void fan(int x,int y)//递归推下一个格子代价 { int i,j; //失败出口 if(x<1||x>m||y<1||y>m)//下标越界 return ; if(a[x][y]==-1)//当前无色 return ; //成功 if(x==m&&y==m) return ; //递归四个方向 for(i=1;i<=4;i++) { //四种情况 if(a[x][y]==a[x+dx[i]][y+dy[i]]) { //同色,判断走不走,下一个代价是否变小 if(f[x][y]<f[x+dx[i]][y+dy[i]]) { f[x+dx[i]][y+dy[i]]=f[x][y];//同色不花钱 fan(x+dx[i],y+dy[i]); } } //剩下的肯定不同色 else if(a[x+dx[i]][y+dy[i]]!=-1) { //如果一定不是无色(异色) //判断走不走 if(f[x][y]+1<f[x+dx[i]][y+dy[i]]) { f[x+dx[i]][y+dy[i]]=f[x][y]+1; fan(x+dx[i],y+dy[i]); } } //剩下的肯定无色 else if(flag[x][y]==1&&a[x+dx[i]][y+dy[i]]==-1)//保证一定不会用两次魔法(只有变与无一种情况会用两次魔法) { //当前变色来的,跳过 continue; } //要变色了 else { //当前本色来的,判断走不走 if(f[x][y]+2<f[x+dx[i]][y+dy[i]]) { f[x+dx[i]][y+dy[i]]=f[x][y]+2; a[x+dx[i]][y+dy[i]]=a[x][y];//变色 flag[x+dx[i]][y+dy[i]]=1; fan(x+dx[i],y+dy[i]); //回溯后恢复标记 a[x+dx[i]][y+dy[i]]=-1; flag[x+dx[i]][y+dy[i]]=0; } } } } int main() { int i,j; cin>>m>>n; for(i=1;i<=m;i++) for(j=1;j<=m;j++) a[i][j]=-1; for(i=1;i<=m;i++) for(j=1;j<=m;j++) f[i][j]=999999; f[1][1]=0;//注意边界,走到1,1不要代价 for(i=1;i<=n;i++) { cin>>x>>y>>w; a[x][y]=w; } fan(1,1); if(f[m][m]==999999) { cout<<-1; return 0; } cout<<f[m][m]; return 0; } ``` 呐 都给你注释好了 AC代码,自己看吧
by 决心少年 @ 2019-11-13 22:10:31


~~我是蒟蒻,不是蒻蒟,别来找我~~
by blackfrog @ 2019-11-13 22:11:08


@[Alpha_Fuze](/user/160352) 看到了吗qwq
by 决心少年 @ 2019-11-13 22:13:30


@[血祭少年](/user/215603) 蟹蟹!
by Alpha_Fuze @ 2019-11-13 22:14:53


@[Alpha_Fuze](/user/160352) 不客气qwq
by 决心少年 @ 2019-11-13 22:15:30


|