农场灌溉问题
2016-05-15 01:24
281 查看
描述
一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
输入
给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图
输出
编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。
输入样例
2 2 DK HF 3 3 ADC FJK IHE -1 -1
输出样例
2 3
提示
参考迷宫问题,实现时关键要解决好各块的表示问题。
一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
输入
给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图
输出
编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。
输入样例
2 2 DK HF 3 3 ADC FJK IHE -1 -1
输出样例
2 3
提示
参考迷宫问题,实现时关键要解决好各块的表示问题。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char A[50][50]; int vis[150][150]; int G[150][150]; int p=0,m,n; void dfs(int i,int j) { if(G[i][j]==0) { G[i][j]=1; } if(i-1>=0&&G[i-1][j]==0) dfs(i-1,j); if(j-1>=0&&G[i][j-1]==0) dfs(i,j-1); if(i+1<3*m&&G[i+1][j]==0) dfs(i+1,j); if(j+1<3*n&&G[i][j+1]==0) dfs(i,j+1); } int main() { int i,j,x,y; while(scanf("%d%d",&m,&n)!=EOF) { memset(A,'\0',sizeof(A)); memset(vis,0,sizeof(vis)); p = 0; if(m==-1&&n==-1) break; getchar(); for(i=0;i<m;i++){ gets(A[i]); } for(i=0;i<m;i++){ for(j=0;j<n;j++){ switch(A[i][j]){ case'A':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1; }break; case'B':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1; }break; case'C':{ G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'D':{ G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1; G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'E':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'F':{ G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1; }break; case'G':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=1,G[3*i+2][3*j+2]=1; }break; case'H':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=1; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'I':{ G[3*i][3*j]=1,G[3*i][3*j+1]=1,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'J':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=1,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; case'K':{ G[3*i][3*j]=1,G[3*i][3*j+1]=0,G[3*i][3*j+2]=1; G[3*i+1][3*j]=0,G[3*i+1][3*j+1]=0,G[3*i+1][3*j+2]=0; G[3*i+2][3*j]=1,G[3*i+2][3*j+1]=0,G[3*i+2][3*j+2]=1; }break; } } } for(i=1;i<3*m;i+=3){ for(j=1;j<3*n;j+=3){ if(G[i][j]==0){ p++; dfs(i,j); } } } printf("%d\n",p); } return 0; }
相关文章推荐
- [Android]Binder池的使用
- android 闪屏分析及解决方案
- Java 集合框架
- 计算机组成.其实机器也会出错.错误检验与纠错的数据编码
- 使用ssh-keygen设置ssh无密码登录
- web.config加密解密方法
- Java知识:(1)JRE和JDK
- 装载问题
- Web 安全登录
- 求图像的周长
- 使用nginx的proxy_cache做网站缓存
- Linux内核态的文件操作
- docker命令总结
- FreeMarker的使用
- Servlet 生命周期、工作原理
- bufbomb-缓冲区溢出实验
- Win10玩魔兽争霸不能全屏显示的设置教程
- 面向对象编程的六大原则
- coj 1597
- Eclipse的下载与安装