寒假Day19-HDU1198 Farm Irrigation-并查集/dfs(两种写法)
DFS写法(这个简单好理解)
#include<string.h> #include<iostream> #include<stdio.h> #include<algorithm> #include<queue> using namespace std; #define inf 0x3f3f3f3f const int N=1100; typedef long long ll; int n,m; char a[55][55]; bool book[55][55]; int dir[4]= {2,3,0,1}; int to[4][2]= {{0,-1},{-1,0},{0,1},{1,0}}; int b[11][4]= {{1,1,0,0},{0,1,1,0},{1,0,0,1},{0,0,1,1},{0,1,0,1},{1,0,1,0},{1,1,1,0},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,1}}; void dfs(int x,int y) { book[x][y]=1; for(int i=0; i<4; i++) { int tx=x+to[i][0]; int ty=y+to[i][1]; int k1=a[x][y]-'A'; int k2=a[tx][ty]-'A'; if(tx>=0&&tx<n&&ty>=0&&ty<m&&book[tx][ty]==0&&b[k1][i]&&b[k2][dir[i]]) dfs(tx,ty); } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==-1&&m==-1) break; memset(book,0,sizeof(book)); for(int i=0; i<n; i++) scanf("%s",a[i]); int ans=0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(book[i][j]==0) { ans++; dfs(i,j); } } } printf("%d\n",ans); } return 0; }
并查集(我还有点迷)
#include<string.h> #include<iostream> #include<stdio.h> #include<algorithm> #include<queue> #include<vector> #include<map> #include<cmath> using namespace std; #define inf 0x3f3f3f3f const int N=110; typedef long long ll; char a[N][N]; int id[N][N],n,m,f[N*N]; int to[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; int b[11][4]= {{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}}; bool book[N][N]; int getf(int x) { if(f[x]==x) return x; return f[x]=getf(f[x]); } void merge(int x,int y) { int t1=getf(x); int t2=getf(y); if(t1!=t2) f[t2]=t1; } void w(int x,int y) { for(int i=0; i<4; i++) { int tx=x+to[i][0]; int ty=y+to[i][1]; if(tx>0&&ty>0&&tx<=n&&ty<=m) { if(i==0) { if(b[id[x][y]][0]&&b[id[tx][ty]][1]&&!book[tx][ty]) { book[tx][ty]=1; merge((x-1)*m+y,(tx-1)*m+ty); w(tx,ty); } } if(i==1) { if(b[id[x][y]][1]&&b[id[tx][ty]][0]&&!book[tx][ty]) { book[tx][ty]=1; merge((x-1)*m+y,(tx-1)*m+ty); w(tx,ty); } } if(i==2) { if(b[id[x][y]][2]&&b[id[tx][ty]][3]&&!book[tx][ty]) { book[tx][ty]=1; merge((x-1)*m+y,(tx-1)*m+ty); w(tx,ty); } } if(i==3) { if(b[id[x][y]][3]&&b[id[tx][ty]][2]&&!book[tx][ty]) { book[tx][ty]=1; merge((x-1)*m+y,(tx-1)*m+ty); w(tx,ty); } } } } } int main() { while(~scanf("%d %d",&n,&m)) { memset(book,0,sizeof(book)); if(n==-1&&m==-1) break; for(int i=1; i<=n*m; i++) f[i]=i; int p=0; for(int i=0; i<n; i++) { scanf("%s",a[i]); for(int j=0; j<m; j++) { // id[i][j]=p++; id[i+1][j+1]=a[i][j]-'A'; } } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(!book[i+1][j+1]) { book[i+1][j+1]=1; w(i+1,j+1); } } } int ans=0; for(int i=1; i<=n*m; i++) { if(f[i]==i) ans++; } printf("%d\n",ans); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」