90分求dalao纠错(第二个点WA了)

P3456 [POI2007] GRZ-Ridges and Valleys

我也~~不会~~没看出来
by 超威蓝猫 @ 2017-10-08 16:58:57


```cpp #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<string> using namespace std; int a[1001][1001],b[1001][1001],//初始化有问题,把“={-1}”去掉 c[9]= {0,0,0,1,1,1,-1,-1,-1},v[9]= {0,1,-1,0,1,-1,0,1,-1},sg,sf,n,i,j; int search(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=n&&b[x][y]!=a[i][j]) { b[x][y]=a[i][j]; for(int k=1; k<=8; ++k) if(x+c[k]>=1&&x+c[k]<=n&&y+v[k]>=1&&y+v[k]<=n) { if(a[x+c[k]][y+v[k]]==a[i][j]) { search(x+c[k],y+v[k]); } else { if(a[x+c[k]][y+v[k]]>a[i][j]) sg=1; if(a[x+c[k]][y+v[k]]<a[i][j]) sf=1; } } } return 1; } int main() { int sfs=0,sgs=0; bool ttt=1; scanf("%d",&n); memset(b,-1,sizeof(b));//在这里把b数组初始化为-1就好了 for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) scanf("%d",&a[i][j]); for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) { if(a[i][j]!=a[1][1]) { ttt=0; break; } } if(ttt) { printf("1 1"); return 0; } for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) { search(i,j); if(sg==1&&sf==0) ++sgs; if(sg==0&&sf==1) ++sfs; sg=sf=0; } printf("%d %d",sfs,sgs); return 0; } 已经懂了,感谢@[xxxhhh](/space/show?uid=47342) ```
by ZhouSong @ 2017-10-08 21:25:32


lz要善用bool啊 我的代码: ```cpp #include<cstdio> using namespace std; const int dx[8]={-1,-1,-1,0,0,1,1,1},dy[8]={-1,0,1,-1,1,-1,0,1},MAXN=1000+5; int n,a[MAXN][MAXN],sf,sg; bool b[MAXN][MAXN],hr,lr,tp=true; bool valid(int x,int y){return 0<=x&&x<n&&0<=y&&y<n;} int dfs(int x,int y,int h) { b[x][y]=true; for(int i=0,nx,ny;i<8;++i) { nx=x+dx[i],ny=y+dy[i]; if(!valid(nx,ny))continue; if(a[nx][ny]>h)hr=true; if(a[nx][ny]<h)lr=true; if(a[nx][ny]==h&&!b[nx][ny])dfs(nx,ny,h); } } int main() { scanf("%d",&n); for(int i=0;i<n;++i) for(int j=0;j<n;++j) { scanf("%d",&a[i][j]); tp&=a[i][j]==a[0][0]; } if(tp) { printf("1 1"); return 0; } for(int i=0;i<n;++i) for(int j=0;j<n;++j) if(!b[i][j]) { hr=lr=false; dfs(i,j,a[i][j]); if(lr&&!hr)++sf; if(hr&&!lr)++sg; } printf("%d %d",sf,sg); } ```
by MornEveGlow @ 2018-08-11 11:40:05


|