标签:水题 lock com nbsp start main code http 深搜
又来放水题了,毕竟我只会水题...
以前写的一道水题...
网址:http://codevs.cn/problem/2919/
大意:从一个给定的点往四个方向找相同的点,统计这些点的个数
看题目再看样例,嗯,宽搜 or 深搜
然而我无聊透了,想用并查集打一下...
思路:全部都搜一遍,如果上面或左面的与目前的点一致,那么就合为一点,最后在找一遍,如果与给定点是同一点的,那么就答案++.
代码如下:
1 //并查集 2 #include<iostream> 3 4 #include<cstdio> 5 6 using namespace std; 7 8 int f[500]={0}; 9 10 int find(int x){ 11 12 while(f[x]!=x)x=f[x]; 13 14 return x; 15 16 } 17 18 int main(){ 19 20 int n,m,x,y,b,b1,c,k=0; 21 22 char a[20][20]; 23 24 scanf("%d%d%d%d",&n,&m,&x,&y); 25 26 for(b=1;b<=n;b++) 27 28 for(b1=1;b1<=m;b1++) 29 30 cin>>a[b][b1]; 31 32 for(b=1;b<=n*m;b++)f[b]=b; 33 34 for(b=1;b<=n;b++) 35 36 for(b1=1;b1<=m;b1++){ 37 38 if(a[b][b1]==a[b-1][b1])f[find((b-1)*m+b1)]=find((b-2)*m+b1);//上面相同合为一点 39 40 if(a[b][b1]==a[b][b1-1])f[find((b-1)*m+b1)]=find((b-1)*m+b1-1);//左面相同合为一点 41 42 } 43 44 c=find((x-1)*m+y);//选项是哪一点 45 46 for(b=1;b<=n*m;b++){ 47 48 if(f[find(b)]==c)k++;//那个选项与题目所求的选项是一点,答案++ 49 50 } 51 52 cout<<k<<endl; 53 54 }
水题一道...
之所以用并查集是因为认为宽搜打的多,深搜比较慢
然而数据太水...并查集打的也不少...
就当练练并查集...
然而又写完一篇博客...
标签:水题 lock com nbsp start main code http 深搜
原文地址:http://www.cnblogs.com/huangjingwen/p/6443833.html