POJ 1659 Frogs' Neighborhood(DFS)
这个题1Y,还是想了几个剪枝63ms,如果直接去暴力的10*10的有点大,因为这相当于无向图,只须枚举一半就可以,也就是45个点,其实还是有点悬的,再加一个剪枝,中间加入判断把不符合情况的,直接淘汰。实习回来的第一个题,DFS调试了半天。。。
1 #include <stdio.h> 2 #include <string.h> 3 int p[101][101],o1[11],o2[11],z,n; 4 void dfs(int x,int y) 5 { 6 int r,c,i,j; 7 if(z) return ; 8 if(o2[x] > o1[x]||o2[y] > o1[y]) 9 return ; 10 if(x > n) 11 { 12 for(i = 1; i <= n; i ++) 13 { 14 if(o2[i] != o1[i]) 15 break; 16 } 17 if(i == n+1) 18 { 19 z = 1; 20 printf("YES\n"); 21 for(i = 1; i <= n; i ++) 22 { 23 for(j = 1; j <= n; j ++) 24 { 25 if(j == 1) 26 printf("%d",p[i][j]); 27 else if(j > i) 28 printf(" %d",p[j][i]); 29 else 30 printf(" %d",p[i][j]); 31 } 32 printf("\n"); 33 } 34 } 35 return; 36 } 37 if(y+1 >= x) 38 { 39 r = x+1; 40 c = 1; 41 } 42 else 43 { 44 r = x; 45 c = y+1; 46 } 47 o2[x] ++; 48 o2[y] ++; 49 p[x][y] = 1; 50 dfs(r,c); 51 p[x][y] = 0; 52 o2[x] --; 53 o2[y] --; 54 dfs(r,c); 55 } 56 int main() 57 { 58 int i,t; 59 scanf("%d",&t); 60 while(t--) 61 { 62 scanf("%d",&n); 63 z = 0; 64 memset(p,0,sizeof(p)); 65 memset(o2,0,sizeof(o2)); 66 for(i = 1; i <= n; i ++) 67 scanf("%d",&o1[i]); 68 dfs(2,1); 69 if(!z) 70 printf("NO\n"); 71 if(t != 0) 72 printf("\n"); 73 } 74 }

浙公网安备 33010602011771号