写代码时要尽可能地精简,否则就可能各种错误;不熟悉的东西尽量避免使用,否则就可能各种错误……比如下面的两个,第一个AC,第二个就RE了:
(差点误人误己)原来第一种写法是水过去的,因为其搜索顺序和第二个不一样,,,,,
#include<cstdio>//当用暴力代替dfs中的for循环时为什么会爆掉?
#include<cstring>
#include<cstdlib>
#define M 751
using namespace std;
int T;
char G[M][M];
int W, H,
dx[8]={1,-1,0,0,1,-1,1,-1},
dy[8]={0,0,1,-1,1,1,-1,-1};
void dfs(int x,int y){
if(x<0||x>=H||y<0||y>=W||G[x][y]=='*')return ;
G[x][y]='*';
T++;
for(int i=0;i<8;i++)
dfs(x+dx[i],y+dy[i]);
}
int main(){
int i,j,max;
while(scanf("%d %d",&W,&H)==2){
//fflush(stdin);
getchar();
for(i=0;i<H;i++)gets(G[i]);
for(T=max=i=0;i<H;i++){
for(j=0;j<W;j++){
dfs(i,j);
if(T>max)max=T;
T=0;
}
}
printf("%d\n",max);
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define M 751
using namespace std;
int T,W,H;
char G[M][M];
const int NEG=-1,POS=1;
void dfs(int x,int y){
if(x<0||x>=H||y<0||y>=W||G[x][y]=='*')return;
T++;
G[x][y]='*';
dfs(x,POS+y);//right
dfs(x,NEG+y);//left
//upward
dfs(NEG+x,y);
dfs(NEG+x,NEG+y);
dfs(NEG+x,POS+y);
//downward
dfs(POS+x,y);
dfs(POS+x,NEG+y);
dfs(POS+x,POS+y);
}
int main(){
int i,j,max;
while(scanf("%d %d",&W,&H)==2){
//fflush(stdin);
getchar();
for(i=0;i<H;i++)gets(G[i]);
for(T=max=i=0;i<H;i++){
for(j=0;j<W;j++){
dfs(i,j);
if(T>max)max=T;
T=0;
}
}
printf("%d\n",max);
}
return 0;
}