P1451 求细胞数量
P1451 求细胞数量
解读一下题目(结合样例)
其实所有非零数字性质都是一样的,方便起见把他们都处理为1
因此这个阵中只有0,1两个数字
此时我们把0数字虚化(再摘下眼镜)
您会发现有4个细胞(4个小聚落)
一定要注意这个样例!!!
一定要注意这个样例!!!
一定要注意这个样例!!!
他在输入细胞的时候,是把他当做一个字符串输入的(泥看每个数字之间没有空格鸭)
在你输入行,列数目以后,打个空格,免得和以后的“细胞”混淆
代码处理:
我的代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<cstdlib> using namespace std; int n,m; int bz[1000][1000],num=0; int dx[4]={-1,0,1,0}, // 上下左右寻找 dy[4]={0,-1,0,1}; void doit(int p,int q) { num++;bz[p][q]=0; //用后清零,防止多次计数 int x,y,t,w; int h[1000][2]; h[1][1]=p;h[1][2]=q; t=0;w=1; do { t++; for(int i=0;i<=3;i++) { x=h[t][1]+dx[i]; y=h[t][2]+dy[i]; if(x>=0&&x<n&&y>=0&&y<m&&bz[x][y]) //防止出界 { w++; //入队 h[w][1]=x; h[w][2]=y; bz[x][y]=0; //用后清零,防止多次计数 } } }while(t<w); //t=w时,队列为空 } int main() { scanf("%d%d\n",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) bz[i][j]=1; //先把他都当做1,出现了0再处理为0 char s[1000]; for(int i=0;i<n;i++) { gets(s); for(int j=0;j<m;j++) if(s[j]=='0') bz[i][j]=0; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(bz[i][j]) doit(i,j); printf("%d",num); return 0; }
柏树:(泥就当我没有写上下面这些代码吧)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<string> #include<cstring> using namespace std; int bz[1000][1000],num=0,n,m; int dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1}; void doit(int p,int q) { int x,y,t,w,i; int h[1000][2]; num++; bz[p][q]=0; t=0;w=1;h[1][1]=p;h[1][2]=q; do { t++; for(i=0;i<=3;i++) { x=h[t][1]+dx[i]; y=h[t][2]+dy[i]; if(x>=0&&x<m&&y>=0&&y<n&&bz[x][y]) { w++; h[w][1]=x; h[w][2]=y; bz[x][y]=0; } } }while(t<w); } int main() { int i,j; char s[100],ch; scanf("%d%d\n",&m,&n); for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) bz[i][j]=1; for(i=0;i<=m;i++) { gets(s); for(j=0;j<=n-1;j++) if(s[j]=='0') bz[i][j]=0; } for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) if(bz[i][j]) doit(i,j); cout<<num; return 0; }
柏树原题(广搜)
柏树类原题(队列)
其实他们的本质啊。。。和人类的本质是一样的