题意:给你一个立方体,其中有16个顶点,每个顶点有4个顶点相邻。每个顶点有一个开关,其中给你8开(1)8关(0),让你交换一条边上两点开光状态,使得编号1-8的开光全关。求出达到要求的最小步数。如果大于3则输出more。。

解题思路:首先用map存储图的状况,对前八个编号为开的每个顶点进行dfs,如果相邻点状态为1,则没必要继续dfs,如果为0,则dfs,一直到dfs到顶点的序号大于等于9,更新本点的最小步数的顶点。最后 求和即可

解题代码:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdio.h>
  4 
  5 
  6 int map[10][5];
  7 int a[20];
  8 int visit[20];
  9 int s;
 10 int ans;
 11 int ok;
 12 void dfs(int k , int step)
 13 {
 14    //printf("%d\n",k);
 15    if(k >= 9)
 16    {
 17         ok = 1;
 18        if(step < s)
 19         {
 20         //  printf("**%d\n",step);
 21           s = step;
 22           ans = k;
 23         }
 24        return ;
 25    }
 26    for(int i = 1;i <= 4; i ++)
 27    {
 28       if(a[map[k][i]] == 0  && !visit[map[k][i]])
 29         {  
 30             visit[map[k][i]] = 1;
 31             dfs(map[k][i],step +1 );
 32             visit[map[k][i]] = 0;
 33         }
 34    }
 35 
 36 }
 37 int main()
 38 {
 39     //    for(int i = 1;i <= 8; i ++)
 40     //    for(int j= 1;j <= 4; j ++)
 41     //    printf("map[%d][%d] =  ;\n",i,j);
 42         map[1][1] = 2 ;
 43         map[1][2] = 3 ;
 44         map[1][3] = 9 ;
 45         map[1][4] =  5;
 46         map[2][1] = 1 ;
 47         map[2][2] = 4 ;
 48         map[2][3] = 6 ;
 49         map[2][4] = 10 ;
 50         map[3][1] = 1 ;
 51         map[3][2] = 7 ;
 52         map[3][3] = 4 ;
 53         map[3][4] = 11 ;
 54         map[4][1] = 3 ;
 55         map[4][2] = 2 ;
 56         map[4][3] =  12;
 57         map[4][4] =  8;
 58         map[5][1] =1  ;
 59         map[5][2] = 6 ;
 60         map[5][3] =  13;
 61         map[5][4] =  7;
 62         map[6][1] = 2 ;
 63         map[6][2] = 5 ;
 64         map[6][3] =  8;
 65         map[6][4] =  14;
 66         map[7][1] =  3;
 67         map[7][2] =  15;
 68         map[7][3] =  5;
 69         map[7][4] =  8;
 70         map[8][1] =  7;
 71         map[8][2] =  6;
 72         map[8][3] =  16;
 73         map[8][4] =  4;
 74         
 75     int n ;
 76     scanf("%d",&n);
 77     for(int cs = 1;cs <= n; cs ++)
 78     {
 79         
 80         
 81         for(int i = 1;i <= 16; i ++)
 82         {
 83           scanf("%d",&a[i]);
 84         }
 85         printf("Case #%d: ",cs);
 86         int sum = 0 ;
 87         for(int i = 1;i <= 8 ;i ++)
 88         {
 89           if(a[i])
 90           {
 91              s = 4; 
 92             memset(visit,0,sizeof(visit));
 93             visit[i] = 1;
 94             ok =0 ;
 95             dfs(i,0);
 96             visit[i] = 0;
 97             if(ok)
 98             {
 99               a[i] = 0 ;
100               a[ans] = 1;
101             }
102             sum += s;
103           }
104           if(sum > 3)
105               break;
106         }
107         if(sum > 3 )
108             printf("more\n");
109         else printf("%d\n",sum);
110     }
111   return 0 ; 
112 }
View Code

 

posted on 2013-11-15 23:39  dark_dream  阅读(214)  评论(0编辑  收藏  举报