玄学错误,求助

P3956 [NOIP2017 普及组] 棋盘

这题两种方法不能混,要么vis,要么修改地图 如果第二种是看题解的话,你再看一遍,想一下
by ChenZhengJie @ 2020-11-01 22:34:09


@[ChenZhengJie](/user/308620) 我又vis又修改了地图,过了
by 做梦想Peach @ 2020-11-01 22:35:57


@[做梦想Peach](/user/239030) 发下代码
by ChenZhengJie @ 2020-11-01 22:39:11


你那加了vis和没加vis一样的 dfs递归的时候把vis[x1][y1]置为true,dfs下一层又判断vis[x1][y1]==true?return ; 这不明摆着vis[x1][y1]永远等于true啊
by ChangYiMing @ 2020-11-01 22:39:29


@[ChenZhengJie](/user/308620) ```cpp #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; bool vis[110][110]; int dx[5]={0,0,-1,1}, dy[5]={1,-1,0,0}; int n,m,ans,map[110][110],x,y,z,f[110][110],i,j; int read () { int k=0,f=1; char c=getchar (); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar ();} while (c>='0'&&c<='9') {k=k*10+c-'0';c=getchar ();} return k*f; } void dfs (int i,int j,int s,bool flag) { if (i==m&&j==m) { if (s<ans) ans=s; return; } if (s>=f[i][j]) return; f[i][j]=s; for (int step=0;step<4;step++) { int nx=i+dx[step]; int ny=j+dy[step]; if (!(nx>=1&&nx<=m&&ny>=1&&ny<=m&&vis[nx][ny]==false)) continue; if (map[nx][ny]!=0) { if (map[nx][ny]==map[i][j]) { vis[nx][ny]=true; dfs (nx,ny,s,false); vis[nx][ny]=false; } else { vis[nx][ny]=true; dfs (nx,ny,s+1,false); vis[nx][ny]=false; } } else { if (flag==false) { vis[nx][ny]=true; map[nx][ny]=map[i][j]; dfs (nx,ny,s+2,true); vis[nx][ny]=false; map[nx][ny]=0; } } } } int main () { //freopen (".in","r",stdin); //freopen (".out","w",stdout); ans=0x7fffffff; m=read (); n=read (); for (i=1;i<=100;i++) for (j=1;j<=100;j++) f[i][j]=0x7fffffff; for (i=1;i<=n;i++) { x=read (); y=read (); z=read (); map[x][y]=z+1; } dfs (1,1,0,false); printf ("%d\n",ans==0x7fffffff ? -1 : ans); return 0; } ```
by 做梦想Peach @ 2020-11-01 22:39:49


~~看我代码写的多美~~
by 做梦想Peach @ 2020-11-01 22:40:09


@[ChangYiMing](/user/228788) 你换一题,把vis删掉,你看能不能过
by 做梦想Peach @ 2020-11-01 22:40:47


我以上讲的是针对以下这个代码 ```cpp #include <stdio.h> #include <cstring> #define ll long long using namespace std; int read(){ int a1=0,k1=1;char c1=getchar(); while(c1<'0'||c1>'9'){ if(c1=='-')k1=-1;c1=getchar(); } while(c1>='0'&&c1<='9'){ a1=a1*10+c1-'0'; c1=getchar(); } return a1*k1; } inline void out1(ll n) { if(n < 0) putchar ('-') , n = -n; if(n > 9) out1(n / 10); putchar(n % 10 + '0'); } inline void out(ll n){ out1(n);printf("\n"); } int m,n,ans=0x3f3f3f3f; int a[102][102],f[102][102]; bool vis[102][102]; int dx[8]={0,1,0,-1,0}; int dy[8]={0,0,1,0,-1}; void dfs(int x,int y,int k,int last){ if(x<1||x>m||y<1||y>m)return ; // if(k>ans)return ; if(k>=f[x][y])return ; f[x][y]=k; if(x==m&&y==m){ if(k<ans)ans=k; f[x][y]=ans; return ; } // printf("%d %d\n",x,y); for(int i=1;i<=4;++i){ int x1=x+dx[i],y1=y+dy[i]; if(a[x1][y1]!=0){ if(a[x1][y1]==a[x][y]) vis[x1][y1]=true,dfs(x1,y1,k,0),vis[x1][y1]=false; else vis[x1][y1]=true,dfs(x1,y1,k+1,0),vis[x1][y1]=false; } // else ; else { if(last==0){ vis[x1][y1]=true; a[x1][y1]=a[x][y]; dfs(x1,y1,k+2,1); a[x1][y1]=0; vis[x1][y1]=false; } } } // return f[x][y]; } int/*signed*/ main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); m=read();n=read(); int x,y,c; for(int i=1;i<=n;++i){ x=read();y=read();c=read(); a[x][y]=c+1; } memset(f,0x7f7f7f,sizeof f); dfs(1,1,0,0); if(ans!=0x3f3f3f3f){ printf("%d\n",ans); } else { printf("-1\n"); } return 0; } ```
by ChangYiMing @ 2020-11-01 22:40:57


@[ChenZhengJie](/user/308620) 为什么“要么vis”“要么修改地图”要2选1
by ChangYiMing @ 2020-11-01 22:42:53


```cpp #include <iostream> #include <cstring> #include <cstdio> using namespace std; int n,m; int mp[105][105]; bool vis[105][105]; int dx[4]={1,0,-1,0}; int dy[4]={0,1,0,-1}; int ans=2147483647; bool pd(int i,int j){ return i>=1&&i<=m&&j>=1&&j<=m; } int f[105][105]; void dfs(int x,int y,int sum,bool fl,int col){ if(x==m&&y==m){ ans=min(ans,sum); return; } if(sum>=ans)return; if(f[x][y]<sum)return; f[x][y]=sum; for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(vis[xx][yy]||!pd(xx,yy))continue; if(mp[xx][yy]==-1&&fl)continue; if(col==mp[xx][yy]){ vis[xx][yy]=1; dfs(xx,yy,sum,0,col); vis[xx][yy]=0; } if(col!=mp[xx][yy]){ if(mp[xx][yy]!=-1){ vis[xx][yy]=1; dfs(xx,yy,sum+1,0,mp[xx][yy]); vis[xx][yy]=0; } if(mp[xx][yy]==-1){ vis[xx][yy]=1; dfs(xx,yy,sum+2,1,col); vis[xx][yy]=0; } } } } int main(){ scanf("%d %d",&m,&n); memset(mp,-1,sizeof(mp)); for(int i=1;i<=n;i++){ int x,y,c; scanf("%d %d %d",&x,&y,&c); mp[x][y]=c; } memset(f,0x3f,sizeof(f)); dfs(1,1,0,0,mp[1][1]); if(ans==2147483647)cout<<-1; else cout<<ans; } ```
by ChenZhengJie @ 2020-11-01 22:46:36


| 下一页