Problem Description
Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pipes, which is marked from A to K, as Figure 1 shows.
Figure 1
Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map
ADC
FJK
IHE
then the water pipes are distributed like
Figure 2
Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn.
Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him?
Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.
Benny has a map of his farm, which is an array of marks denoting the distribution of water pipes over the whole farm. For example, if he has a map
ADC
FJK
IHE
then the water pipes are distributed like
Several wellsprings are found in the center of some squares, so water can flow along the pipes from one square to another. If water flow crosses one square, the whole farm land in this square is irrigated and will have a good harvest in autumn.
Now Benny wants to know at least how many wellsprings should be found to have the whole farm land irrigated. Can you help him?
Note: In the above example, at least 3 wellsprings are needed, as those red points in Figure 2 show.
Input
There are several test cases! In each test case, the first line contains 2 integers M and N, then M lines follow. In each of these lines, there are N characters, in the range of 'A' to 'K', denoting the type of water pipe over the corresponding square. A negative M or N denotes the end of input, else you can assume 1 <= M, N <= 50.
Output
For each test case, output in one line the least number of wellsprings needed.
Sample Input
2 2
DK
HF
3 3
ADC
FJK
IHE
-1 -1
Sample Output
2
3
http://acm.hdu.edu.cn/showproblem.php?pid=1198;
简单搜索题目;
题目思路:
1、首先把A——F的每一个形状描述出来(可以与另一个想通的赋值为1,无法相通的赋值为0,每一个方形都有四个值up,down,left,right);
2、判断与下一个方形是否会相通,根据相对位置,如果本身在下一个方形的上面,则判断本身的down与下一个方形的up值是不是都是1,是的话,就能相通,则标记次方形。
其他的相对位置同理去思考,不作具体解释。。。
1 #include <iostream> 2 #include <stdio.h> 3 #include <queue> 4 #include <string.h> 5 using namespace std; 6 struct node 7 { 8 int up,down,left,right; 9 }dd[11]; 10 11 int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}}; 12 13 struct node2 14 { 15 int xx,yy; 16 }; 17 18 int m,n; 19 int map[55][55]; 20 bool flag[55][55]; 21 queue<node2>q; 22 23 bool judge(node2 p,node2 temp,int kk) 24 { 25 if(kk==0)//上下; 26 { 27 if(dd[map[p.xx][p.yy]].down==1 && dd[map[temp.xx][temp.yy]].up==1) 28 { 29 return true; 30 } 31 else 32 { 33 return false; 34 } 35 } 36 else if(kk==1)//左右; 37 { 38 if(dd[map[p.xx][p.yy]].right==1 && dd[map[temp.xx][temp.yy]].left==1) 39 { 40 return true; 41 } 42 else 43 { 44 return false; 45 } 46 } 47 else if(kk==2)//下上; 48 { 49 if(dd[map[p.xx][p.yy]].up==1 && dd[map[temp.xx][temp.yy]].down==1) 50 { 51 return true; 52 } 53 else 54 { 55 return false; 56 } 57 } 58 else //右左; 59 { 60 if(dd[map[p.xx][p.yy]].left==1 && dd[map[temp.xx][temp.yy]].right==1) 61 { 62 return true; 63 } 64 else 65 { 66 return false; 67 } 68 } 69 } 70 71 bool judge2(node2 temp) 72 { 73 if(temp.xx<0 || temp.xx>=m || temp.yy<0 || temp.yy>=n || flag[temp.xx][temp.yy]) 74 return false; 75 return true; 76 } 77 78 void bfs(int x,int y) 79 { 80 while(!q.empty()) 81 { 82 q.pop(); 83 } 84 node2 temp,p; 85 int i; 86 p.xx=x; 87 p.yy=y; 88 q.push(p); 89 flag[x][y]=true; 90 while(!q.empty()) 91 { 92 p=q.front(); 93 q.pop(); 94 for(i=0;i<4;i++) 95 { 96 temp=p; 97 temp.xx+=dir[i][0]; 98 temp.yy+=dir[i][1]; 99 if(!judge2(temp)) 100 continue; 101 if(judge(p,temp,i)) 102 { 103 q.push(temp); 104 flag[temp.xx][temp.yy]=true; 105 } 106 } 107 } 108 109 } 110 void init() 111 { 112 dd[0].up=1,dd[0].down=0,dd[0].left=1,dd[0].right=0; 113 dd[1].up=1,dd[1].down=0,dd[1].left=0,dd[1].right=1; 114 dd[2].up=0,dd[2].down=1,dd[2].left=1,dd[2].right=0; 115 dd[3].up=0,dd[3].down=1,dd[3].left=0,dd[3].right=1; 116 dd[4].up=1,dd[4].down=1,dd[4].left=0,dd[4].right=0; 117 dd[5].up=0,dd[5].down=0,dd[5].left=1,dd[5].right=1; 118 dd[6].up=1,dd[6].down=0,dd[6].left=1,dd[6].right=1; 119 dd[7].up=1,dd[7].down=1,dd[7].left=1,dd[7].right=0; 120 dd[8].up=0,dd[8].down=1,dd[8].left=1,dd[8].right=1; 121 dd[9].up=1,dd[9].down=1,dd[9].left=0,dd[9].right=1; 122 dd[10].up=1,dd[10].down=1,dd[10].left=1,dd[10].right=1; 123 memset(flag,false,sizeof(flag)); 124 125 } 126 int main() 127 { 128 while(~scanf("%d%d",&m,&n)) 129 { 130 int i,j; 131 if(m<0 || n<0) 132 break; 133 init(); 134 char op; 135 for(i=0;i<m;i++) 136 { 137 for(j=0;j<n;j++) 138 { 139 cin>>op; 140 map[i][j]=op-'A'; 141 } 142 } 143 144 int cnt=0; 145 146 for(i=0;i<m;i++) 147 { 148 for(j=0;j<n;j++) 149 { 150 if(!flag[i][j]) 151 { 152 bfs(i,j); 153 cnt++; 154 } 155 } 156 } 157 printf("%d\n",cnt); 158 159 } 160 return 0; 161 }