2009-11-06 19:47:51來源不明

95高市資訊學科能力競賽 關燈

作法: 與97高市資訊學科能力競賽 6. 按鈕問題 相同

DFS 窮舉

自行點閱

/************************************************************/

#include<stdio.h>
#include<stdlib.h>
int N=10,M=10,a,b,MIN;
char map[11][11];
void click(int x,int y)
{
   map[x][y]=1-map[x][y];
   if(x-1>=0)  map[x-1][y]=1-map[x-1][y];
   if(x+1<N)   map[x+1][y]=1-map[x+1][y];
   if(y-1>=0)  map[x][y-1]=1-map[x][y-1];
   if(y+1<M)   map[x][y+1]=1-map[x][y+1];
}
void DFS(int x,int y,int time)
{
   if(y==M) ++x,y=0;
  
   if(x==0)
      {
         DFS(x,y+1,time);
         click(x,y);/*按下*/
         DFS(x,y+1,time+1);
         click(x,y);/*還原*/
      }
   else if(x<N)
      {
          if(map[x-1][y]==0)  /*上面那格是開的*/
            {
               click(x,y);   /*則按下此格*/
               DFS(x,y+1,time+1);
               click(x,y);
            }
          else  DFS(x,y+1,time);
      }
   else
      {
         int a;
         for(a=0;a<M;a++)
            if(map[N-1][a]==0)
              return;
         if(time<MIN) MIN=time;
      }
}
main()
{
 int t;
 while(scanf("%d",&t)==1)
      while(t--)
      {
         for(a=0;a<10;a++)
            {
             scanf("%s",map[a]);
               for(b=0;b<10;b++)
                 map[a][b]=(map[a][b]=='O')?0:1; /*1開 2 關*/
            }
         MIN=2147483647;
         DFS(0,0,0);
         printf("%d\n",MIN);
      }
 return 0;
}