标签:names geo blog other ase cross set pipe another
2 2 DK HF 3 3 ADC FJK IHE -1 -1
2 3
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> using namespace std; int mp[11]={9,3,12,6,5,10,11,13,14,7,15}; //表示一种状态,B(1<<0)+(1<<1)=3:表示上右是通的. int dr[4][2]={{-1,0},{0,1},{1,0},{0,-1} };// 上,右,下,左 int n,m; char ch[110][110]; int fa[110*110]; bool ok(int x,int y) { if (x<0 || x>=n) return 0; if (y<0 || y>=m) return 0; return 1; } int findfa(int k) { if (fa[k]==k) return k; else return fa[k]=findfa(fa[k]); } int main() { while(~scanf("%d%d",&n,&m)) { if (n<0 || m<0) break; for(int i=0;i<n;i++) scanf("%s",&ch[i]); for(int i=0;i<n*m;i++) fa[i]=i; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { for(int k=1;k<3;k++) //向右,向下两个方向 { int x=i+dr[k][0]; int y=j+dr[k][1]; if (!ok(x,y)) continue; if ( (mp[ch[i][j]-‘A‘]&(1<<k))==0 || (mp[ch[x][y]-‘A‘]&(1<<((k+2)%4)))==0 ) continue; int fx=findfa(i*m+j); //之前一直错,问题在这里应该是*m而不是n。 int fy=findfa(x*m+y); if (fx!=fy) fa[fx]=fy; } } int sum=0; for(int i=0;i<n*m;i++) if (fa[i]==i) sum++; printf("%d\n",sum); } return 0; }
HDU 1198 Farm Irrigation(并查集+位运算)
标签:names geo blog other ase cross set pipe another
原文地址:http://www.cnblogs.com/stepping/p/7210072.html