水管游戏 本题题意是有11种水管 任意摆放 问建多少井能灌满所有管道
关键是水管的预处理 用深搜和并查集都行
我写的是深度搜索 并查集不太会
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int n,m; char str[52][52]; int flag[52][52]; int a[][4]={ {1,1,0,0},{1,0,0,1},{0,1,1,0},{0,0,1,1}, {1,0,1,0},{0,1,0,1},{1,1,0,1},{1,1,1,0},{0,1,1,1}, {1,0,1,1},{1,1,1,1} };//预处理 int b[][2]={-1,0,0,-1,1,0,0,1}; int sum; void dfs(int x,int y) { flag[x][y]=1; for(int i = 0; i < 4; i++) { if(a[str[x][y]-'A'][i]) { int nx = x+b[i][0]; int ny = y+b[i][1]; if(nx < 0 || ny < 0 || nx >= m || ny >= n) continue; switch(i) { case 0:if(a[str[nx][ny]-'A'][2] && !flag[nx][ny]) dfs(nx,ny); break; case 1:if(a[str[nx][ny]-'A'][3] && !flag[nx][ny]) dfs(nx,ny); break; case 2:if(a[str[nx][ny]-'A'][0] && !flag[nx][ny]) dfs(nx,ny); break; case 3:if(a[str[nx][ny]-'A'][1] && !flag[nx][ny]) dfs(nx,ny); break; }//四个方向一次判断是否搜索 } } } int main() { while(~scanf("%d%d",&m,&n)&&m>0&&n>0){ memset(flag,0,sizeof(flag)); sum=0; for(int i=0; i<m; i++) scanf("%s",str[i]); for(int i=0; i<m; i++) for(int j=0; j<n; j++){ if(!flag[i][j]){ sum++; dfs(i,j); } } cout<<sum<<endl; } return 0; }