Problem description
There are two binary strings, their length is 8, you should change the first to the second through several approach. You need output the minimal steps to change them.
These are the approach legle:
1.Make the whole string one step to right,the first position should be '1'.
Example: 10001100---->11000110;
2.Change two character nearby.
Example: 10010001---->10001001;
3.Change four series '1' to '0',or four series '0' to '1'.If the series character longer than four,you can change any four series characters of them.
Example: 00111101---->00000001;10000011---->11111011;


Input
There are many test cases.Every test case contain two 8-binary string,division by space.


Output
Every line output a number for the minimal steps to change the two strings.


Sample Input
00011110 10000000
Sample Output
2
 
 
广度搜索:
 
				
  1 #include  < iostream >
  2 #include  < queue >
  3 #include  < algorithm >
  4 using   namespace  std;
  5 bool   mark[ 256 ];
  6 int    binary[ 8 ] = 1 2 4 8 16 32 64 128  } ;
  7 struct  Node
  8 {
  9      int    steps;
 10      char   states[ 9 ];
 11     Node()
 12      {}
 13     Node(  int  s,  char  str[ 9 ] )
 14         :steps(s)
 15      {
 16         strcpy( states, str );
 17     }

 18 }
;
 19 int  getn(  char *  str )
 20 {
 21      int  total =   0 ;
 22      for  (  int  i =   0 ; i <   8 ++ i )
 23         total +=  ( ( str[i] -   ' 0 '  ) *  binary[ 7 -  i] );
 24      return  total;
 25 }

 26 int  numof0(  char *  str,  int &  pos )
 27 {
 28      int  max =   0 ;
 29      int  i =   0 ;
 30      for  (  int  i =   0 ; i <=   4 ++ i )
 31      {
 32          int  t =  i;
 33          int  total =   0 ;
 34          while  ( str[t] ==   ' 0 '  )
 35          {
 36             t ++ ;
 37             total ++ ;
 38         }

 39          if  ( total >  max )
 40          {
 41             max =  total;
 42             pos =  i;
 43         }

 44     }

 45      return  max;
 46 }

 47 int  numof1(  char *  str,  int &  pos )
 48 {
 49      int  max =   0 ;
 50      int  i =   0 ;
 51      for  (  int  i =   0 ; i <=   4 ++ i )
 52      {
 53          int  t =  i;
 54          int  total =   0 ;
 55          while  ( str[t] ==   ' 1 '  )
 56          {
 57             t ++ ;
 58             total ++ ;
 59         }

 60          if  ( total >  max )
 61          {
 62             max =  total;
 63             pos =  i;
 64         }

 65     }

 66      return  max;
 67 }

 68 int  main()
 69 {
 70      char    source[ 9 ];
 71      char    dest[ 9 ];
 72      while  ( scanf( " %s%s " ,source, dest) !=  EOF )
 73      {
 74         queue < Node >  q;
 75         q.push ( Node( 0 ,source) );
 76         memset( mark,  false sizeof (mark) );
 77         mark[ getn(source) ] =   true ;
 78          while  (  ! q.empty () )
 79          {
 80              struct  Node head =  q.front ();
 81              char    temp[ 9 ];
 82              int     n;
 83             q.pop ();
 84              if  ( strcmp( head.states, dest ) ==   0  )
 85              {
 86                 printf( " %d\n " ,head.steps );
 87                  break ;
 88             }

 89             
 90             strcpy( temp, head.states );
 91              for  (  int  i =   7 ; i >   0 ; i --  )
 92                 temp[i] =  temp[i - 1 ];
 93             temp[ 0 ] =   ' 1 ' ;
 94             n =  getn(temp);
 95              if  (  ! mark[n] )
 96              {
 97                 q.push ( Node( head.steps +   1 , temp ) );
 98                 mark[n] =   true ;
 99             }

100              for int  i =   0 ; i <   7 ++ i )
101              {
102                 strcpy( temp, head.states );
103                  if  ( temp[i] !=  temp[i + 1 ] )
104                  {
105                     std::swap ( temp[i], temp[i + 1 ] );
106                     n =  getn(temp);
107                      if  (  ! mark[n] )
108                      {
109                         q.push ( Node( head.steps +   1 , temp ) );
110                         mark[n] =   true ;
111                     }

112                 }

113             }

114              int  pos;
115              int  num =  numof0( head.states, pos );
116              if  ( num >=   4  )
117              {
118                  for  (  int  i =  pos; i <=  num -   4 +  pos;  ++ i )
119                  {
120                     strcpy( temp, head.states );
121                      for  (  int  j =  i; j <  i +   4 ++ j )
122                         temp[j] =   ' 1 ' ;
123                     n =  getn(temp);
124                      if  (  ! mark[n] )
125                      {
126                         q.push ( Node( head.steps +   1 , temp ) );
127                         mark[n] =   true ;
128                     }

129                 }
    
130             }

131         
132             num =  numof1( head.states, pos );
133              if  ( num >=   4  )
134              {        
135                  for  (  int  i =  pos; i <=  num -   4 +  pos;  ++ i )
136                  {
137                     strcpy( temp, head.states );
138                      for  (  int  j =  i; j <  i +   4 ++ j )
139                         temp[j] =   ' 0 ' ;
140                     n =  getn(temp);
141                      if  (  ! mark[n] )
142                      {
143                         q.push ( Node( head.steps +   1 , temp ) );
144                         mark[n] =   true ;
145                     }

146                 }

147             }

148         }
//   while q.empty();
149     }

150      return   0 ;
151 }

152
posted on 2008-08-18 20:14 Darren 阅读(264) 评论(0)  编辑 收藏 引用 所属分类: 搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理