我也~~不会~~没看出来
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