水题,求连通分量的个数,深搜一遍即可,之所以这么水还写下来,是因为样例一组有误的数据弄得我调试了一个多小时,白白浪费了很多精力和时间。最后一组数据的两个5后面多了一个空格:
我用 getchar 来接收字符,所以因为它这个无故多出来的空格使得后面的字符全乱了,调试输出时才有了千奇百怪的结果,不得不吐槽下杭电你也太坑了,虽说也不是第一次,之前你把行和列的输入顺序故意弄反,现在又在这里留下个这么恶心的坑,有必要卡这些非算法和编程的东西么?
1 #include<cstdio> 2 #include<cstring> 3 4 char s[102][102]; 5 int dir[2][8]= {{-1,-1,-1,0,0,1,1,1},{-1,0,1,-1,1,-1,0,1}}; 6 7 void dfs(int i, int j){ 8 if(s[i][j]=='*') return ; 9 s[i][j]= '*'; 10 for(int k=0; k<8; ++k){ 11 int di= i+dir[0][k], dj= j+dir[1][k]; 12 if(s[di][dj]=='@') dfs(di,dj); 13 } 14 } 15 16 int main(){ 17 int n,m,i,j; 18 while(~scanf("%d%d",&n,&m),n){ 19 getchar(); 20 memset(s,'*',sizeof(s)); 21 for(i=1; i<=n; ++i,getchar()) 22 for(j=1; j<=m; ++j) 23 s[i][j]= getchar(); 24 int ans= 0; 25 for(i=1; i<=n; ++i) 26 for(j=1; j<=m; ++j) 27 if(s[i][j]=='@'){ 28 dfs(i,j); 29 ++ans; 30 } 31 printf("%d ",ans); 32 } 33 return 0; 34 }