HDU 1045 Fire Net(DFS)
普通的DFS。
1 #include <stdio.h> 2 #include <string.h> 3 char p[5][5]; 4 int max,o[5][5],n; 5 int judge(int x,int y) 6 { 7 int i,z = 1; 8 for(i = x+1;i <= n-1;i ++) 9 { 10 if(o[i][y] == 2) 11 { 12 z = 0; 13 break; 14 } 15 else if(o[i][y] == 1) 16 break; 17 } 18 for(i = x-1;i >= 0;i --) 19 { 20 if(o[i][y] == 2) 21 { 22 z = 0; 23 break; 24 } 25 else if(o[i][y] == 1) 26 break; 27 } 28 for(i = y+1;i <= n-1;i ++) 29 { 30 if(o[x][i] == 2) 31 { 32 z = 0; 33 break; 34 } 35 else if(o[x][i] == 1) 36 break; 37 } 38 for(i = y-1;i >= 0;i --) 39 { 40 if(o[x][i] == 2) 41 { 42 z = 0; 43 break; 44 } 45 else if(o[x][i] == 1) 46 break; 47 } 48 return z; 49 } 50 void dfs(int x,int y,int step) 51 { 52 int r,c; 53 if(x > n-1) 54 { 55 if(max < step) 56 max = step; 57 return ; 58 } 59 if(y == n-1) 60 { 61 r = x+1; 62 c = 0; 63 } 64 else 65 { 66 r = x; 67 c = y+1; 68 } 69 if(o[x][y] == 0) 70 { 71 if(judge(x,y)) 72 { 73 o[x][y] = 2; 74 dfs(r,c,step+1); 75 o[x][y] = 0; 76 dfs(r,c,step); 77 } 78 else 79 { 80 dfs(r,c,step); 81 } 82 } 83 else 84 dfs(r,c,step); 85 } 86 int main() 87 { 88 int i,j; 89 while(scanf("%d%*c",&n)!=EOF) 90 { 91 if(!n) break; 92 max = 0; 93 memset(o,0,sizeof(o)); 94 for(i = 0; i <= n-1; i ++) 95 gets(p[i]); 96 for(i = 0; i <= n-1; i ++) 97 for(j = 0; j <= n-1; j ++) 98 { 99 if(p[i][j] == 'X') 100 o[i][j] = 1; 101 } 102 dfs(0,0,0); 103 printf("%d\n",max); 104 } 105 return 0; 106 }