农场灌溉问题
来源:互联网 发布:化学绘图软件 安卓 编辑:程序博客网 时间:2024/04/28 09:02
描述
一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。
输入
给出若干由字母表示的最大不超过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;}
0 0
- 农场灌溉问题
- 农场灌溉问题ZOJ2412
- 农场灌溉问题
- noj算法设计——农场灌溉问题
- 1144 农场灌溉
- 农场计数问题
- OO思想解决农场养牛问题
- 面向对象思想解决农场养牛问题
- 最优灌溉
- 计蒜客 灌溉
- 并查集解决最优灌溉问题(最小生成树问题)
- 腾讯或一次性收购开心农场:恐面临多重问题
- 地狱农场
- 江北农场
- 开心农场
- 《开心农场》
- 农场启示
- 布拉格农场
- 装载问题
- Java 集合框架
- [leetcode] 310. Minimum Height Trees 解题报告
- android 闪屏分析及解决方案
- [Android]Binder池的使用
- 农场灌溉问题
- 迷宫问题
- android开发笔记之多媒体—VideoView播放视频
- WPF 更换图片
- 归并排序
- IO流
- Qt学习笔记:QMainWindow与QDockWidget
- 游戏几种同步策略
- 异常与异常处理