有点像模拟的IDA*,做了才发现和大多数人的思路一样

题意:定义chessboard上的8个移位操作:处于操作端的元素放到所在列(行)的最尾,该列(行)的所有元素向操作端方向移动一格。求最短的操作序列使得中间8个形成正方形的元素相等。

Memory: 208K   Time: 266MS

    #include <iostream>
    
using namespace std;

    
int a1[200],a2[200],a3[200],a4[200],beg1,beg2,beg3,beg4,array[25],deep,cnt[4];
    
char path[50];

    
void shift(int n,bool left){
        
switch(n){
        
case 1:
            
if(left){
                a1[beg1
+7]=a1[beg1];

                a3[beg3
+2]=a1[beg1+3];
                a4[beg4
+2]=a1[beg1+5];
                beg1
++;
            }
            
else{
                a1[beg1
-1]=a1[beg1+6];
                
                a3[beg3
+2]=a1[beg1+1];
                a4[beg4
+2]=a1[beg1+3];
                beg1
--;
            }
            
break;
        
case 2:
            
if(left){
                a2[beg2
+7]=a2[beg2];
                
                a3[beg3
+4]=a2[beg2+3];
                a4[beg4
+4]=a2[beg2+5];
                beg2
++;
            }
            
else{
                
                a2[beg2
-1]=a2[beg2+6];
                
                a3[beg3
+4]=a2[beg2+1];
                a4[beg4
+4]=a2[beg2+3];
                beg2
--;
            }
            
break;
        
case 3:
            
if(left){
                a3[beg3
+7]=a3[beg3];
                
                a1[beg1
+2]=a3[beg3+3];
                a2[beg2
+2]=a3[beg3+5];
                beg3
++;
            }
            
else{
                a3[beg3
-1]=a3[beg3+6];

                a1[beg1
+2]=a3[beg3+1];
                a2[beg2
+2]=a3[beg3+3];
                beg3
--;
            }
            
break;
        
case 4:
            
if(left){
                a4[beg4
+7]=a4[beg4];
                
                a1[beg1
+4]=a4[beg4+3];
                a2[beg2
+4]=a4[beg4+5];
                beg4
++;
            }
            
else{
                a4[beg4
-1]=a4[beg4+6];
                
                a1[beg1
+4]=a4[beg4+1];
                a2[beg2
+4]=a4[beg4+3];
                beg4
--;
            }
            
break;
        }
    }

    
int f(){
        
int i,mx=0;
        cnt[
1]=cnt[2]=cnt[3]=0;

        cnt[array[a1[beg1
+2]]]++;
        cnt[array[a1[beg1
+4]]]++;
        cnt[array[a2[beg2
+4]]]++;
        cnt[array[a2[beg2
+2]]]++;
        cnt[array[a3[beg3
+3]]]++;
        cnt[array[a1[beg1
+3]]]++;
        cnt[array[a4[beg4
+3]]]++;
        cnt[array[a2[beg2
+3]]]++;

        
for(i=1;i<=3;i++)
            
if(cnt[i]>mx)
                mx
=cnt[i];
        
return 8-mx;
    }

        



    
void init(){
        beg1
=beg2=beg3=beg4=100;
        a1[
100]=1;
        a1[
101]=3;
        a1[
102]=7;
        a1[
103]=12;
        a1[
104]=16;
        a1[
105]=21;
        a1[
106]=23;

        a2[
100]=2;
        a2[
101]=4;
        a2[
102]=9;
        a2[
103]=13;
        a2[
104]=18;
        a2[
105]=22;
        a2[
106]=24;

        a3[
100]=5;
        a3[
101]=6;
        a3[
102]=7;
        a3[
103]=8;
        a3[
104]=9;
        a3[
105]=10;
        a3[
106]=11;

        a4[
100]=14;
        a4[
101]=15;
        a4[
102]=16;
        a4[
103]=17;
        a4[
104]=18;
        a4[
105]=19;
        a4[
106]=20;
        
/*
                     a1:   a2:
                     1     2
                     3     4
        a3: 5  6  7  8  9  10 11
                     12    13
        a4: 14 15 16 17 18 19 20
                     21    22
                     23    24
        
*/
    }

    
bool idfs(int d){
        
if(d==deep){
            
if(array[a1[beg1+2]]==array[a1[beg1+4]] 
                
&& array[a1[beg1+2]]==array[a2[beg2+4]] 
                
&& array[a1[beg1+2]]==array[a2[beg2+2]]
                
&& array[a1[beg1+2]]==array[a3[beg3+3]]
                
&& array[a1[beg1+2]]==array[a1[beg1+3]]
                
&& array[a1[beg1+2]]==array[a4[beg4+3]]
                
&& array[a1[beg1+2]]==array[a2[beg2+3]])
                
return true;
            
else
                
return false;
        }

        
if(d+f()>deep)
            
return false;

        shift(
1,true);
        path[d]
='A';
        
if(idfs(d+1))
            
return true;
        shift(
1,false);
        
        shift(
2,true);
        path[d]
='B';
        
if(idfs(d+1))
            
return true;
        shift(
2,false);

        shift(
3,false);
        path[d]
='C';
        
if(idfs(d+1))
            
return true;
        shift(
3,true);

        shift(
4,false);
        path[d]
='D';
        
if(idfs(d+1))
            
return true;
        shift(
4,true);

        shift(
2,false);
        path[d]
='E';
        
if(idfs(d+1))
            
return true;
        shift(
2,true);

        shift(
1,false);
        path[d]
='F';
        
if(idfs(d+1))
            
return true;
        shift(
1,true);
        
        shift(
4,true);
        path[d]
='G';
        
if(idfs(d+1))
            
return true;
        shift(
4,false);

        shift(
3,true);
        path[d]
='H';
        
if(idfs(d+1))
            
return true;
        shift(
3,false);

        
return false;
    }


        

    
int main(){
        
int i;
        
while(scanf("%d",&array[1]) && array[1]){
            
for(i=2;i<=24;i++)
                scanf(
"%d",&array[i]);
            
for(deep=0;deep<100;deep++){
                init();
                
if(idfs(0))
                    
break;
            }
            
if(deep==0)
                printf(
"No moves needed\n%d\n",array[a1[beg1+2]]);
            
else{
                
for(i=0;i<deep;i++)
                    printf(
"%c",path[i]);
                printf(
"\n%d\n",array[a1[beg1+2]]);
            }
        }
        
return 0;
    }

相关文章:

  • 2021-07-27
  • 2021-05-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-18
  • 2021-08-14
猜你喜欢
  • 2021-10-26
  • 2022-03-02
  • 2021-04-15
  • 2022-12-23
  • 2022-01-13
相关资源
相似解决方案