HDU 1198 Farm Irrigation(DFS)
挺有意思的,我所理解的题意:最少打几个井,本来以为挺简单,最后发现实现的时候搞麻烦了,注意一下往下搜的条件是两个字母,在那个方向匹配上,才能继续搜下去。1Y。
1 #include <stdio.h> 2 #include <string.h> 3 char p[51][51]; 4 int k[12][4] = {{1,1,0,0},{0,1,1,0},//记录所有的字母4个方向,顺序为左上右下 5 {1,0,0,1},{0,0,1,1},{0,1,0,1},{1,0,1,0},//1代表有,0代表没有 6 {1,1,1,0},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,1}}; 7 int o[51][51],n,m; 8 void dfs(int x,int y) 9 { 10 int s,i,t; 11 s = p[x][y] - 'A'; 12 for(i = 0;i <= 3;i ++) 13 { 14 if(i == 0&&k[s][i]) 15 { 16 if(y-1 >= 0) 17 { 18 t = p[x][y-1] - 'A'; 19 if(!o[x][y-1]&&k[t][2])//没搜过且这个方向对应的方向也有河流 20 { 21 o[x][y-1] = 1; 22 dfs(x,y-1); 23 } 24 } 25 } 26 else if(i == 1&&k[s][i]) 27 { 28 if(x-1 >= 0) 29 { 30 t = p[x-1][y] - 'A'; 31 if(!o[x-1][y]&&k[t][3]) 32 { 33 o[x-1][y] = 1; 34 dfs(x-1,y); 35 } 36 } 37 } 38 else if(i == 2&&k[s][i]) 39 { 40 if(y+1 <= m-1) 41 { 42 t = p[x][y+1] - 'A'; 43 if(!o[x][y+1]&&k[t][0]) 44 { 45 o[x][y+1] = 1; 46 dfs(x,y+1); 47 } 48 } 49 } 50 else if(i == 3&&k[s][i]) 51 { 52 if(x+1 <= n-1) 53 { 54 t = p[x+1][y] - 'A'; 55 if(!o[x+1][y]&&k[t][1]) 56 { 57 o[x+1][y] = 1; 58 dfs(x+1,y); 59 } 60 } 61 } 62 } 63 } 64 int main() 65 { 66 int i,j,z; 67 while(scanf("%d%d%*c",&n,&m)!=EOF) 68 { 69 memset(o,0,sizeof(o)); 70 z = 0; 71 if(n < 0||m < 0) 72 break; 73 for(i = 0;i <= n-1;i ++) 74 scanf("%s",p[i]); 75 for(i = 0;i <= n-1;i ++) 76 for(j = 0;j <= m-1;j ++) 77 { 78 if(!o[i][j]) 79 { 80 o[i][j] = 1; 81 dfs(i,j); 82 z ++; 83 } 84 } 85 printf("%d\n",z); 86 } 87 return 0; 88 }

浙公网安备 33010602011771号