dfs的思路我是一下就想到了的(开心)。ios
学到的点其实在于像这种“连在一块儿”的样例输入,必定不能再去弄int二维数组了(由于数据之间无空格),c++
而是弄成char二维数组,而后在输入的时候用数组
for(int i=0;i<n;i++) scanf("%s",a[i]);
说明:对这个一维数组的地址直接赋字符串,因此也能够不写&a[i]了由于a[i]在二维数组中原本就是地址,以后就当二维数组用就好了,输入后无需其余改动。spa
其次,最好用scanf。由于用cin的话,存在的问题就是输入的字符串长度是有限制的。code
因此牢记这种状况的输入写法就好了。blog
AC代码(有剪枝):ci
#include<iostream> #include<bits/stdc++.h> using namespace std; char a[1001][1001]; int n,m; int rowVis[1001]; //拿来剪枝的 int columnVis[1001]; //拿来剪枝的 void dfs(int x,int y) { a[x][y]='2'; //表示被炸过了 if(rowVis[x]==0) //表示行上没被清理过(清理过一次就不用再清理了) { rowVis[x]=1; for(int i=0;i<m;i++) { if(a[x][i]=='1') //行上被引爆 dfs(x,i); } } if(columnVis[y]==0) //表示列上没被清理过 { columnVis[y]=1; for(int i=0;i<n;i++) { if(a[i][y]=='1') //列上被引爆 dfs(i,y); } } } int main() { int cnt=0; cin>>n>>m; for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='1') { cnt++; dfs(i,j); } } } cout<<cnt; return 0; }