zoukankan      html  css  js  c++  java
  • 八数码问题--bfs

     1 #include<iostream>
     2 #include<cstring>
     3 #define max 1000000
     4 using namespace std;
     5 const int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
     6 string origion;
     7 string goal;
     8 string state[max];
     9 int vis[370000];
    10 
    11 bool encode(string str){  //康拖展开 编码
    12     int x=1,sum=0,n=8;
    13     for(int i=1;i<9;i++){
    14         x=i*x;
    15     }
    16     for( int i=0 ; i < str.length() ; i++){
    17         if( str[i]<='9' && str[i]>='0' ){
    18             int cnt=0;
    19             for(int j=i+1 ; j<str.length() ; j++){
    20                 if(str[j]!=' '&& str[j] < str[i]){
    21                     cnt++;
    22                 }
    23             }
    24             sum+=cnt*x;        
    25             if(x!=1)
    26                 x=x/n;
    27                 n--;        
    28         }
    29     }
    30     if(vis[sum]){
    31         vis[sum]=0;
    32         return true;
    33     }
    34     return false;
    35 }
    36 int bfs(){
    37     state[0]=origion;
    38     encode(origion);
    39     int front=0,rear=1;
    40     int floor=0,amt=1;
    41     int temp=0;
    42     
    43     while(front!=rear){
    44         string str1=state[front],str2=str1;
    45         front=(front+1)%max;
    46 
    47         if(amt==0){
    48             amt=temp;
    49             temp=0;
    50             floor++;
    51         }
    52         if(str1==goal){
    53             return floor;
    54         }
    55         int pos=0,i,j;
    56         while(pos<str1.length()){
    57             if(str1[pos]=='0') break;
    58             pos++;
    59         }
    60         i=pos/6;
    61         j=(pos/2)%3;
    62         
    63         for(int k=0;k<4;k++){
    64             str1=str2;
    65             int x=i+dir[k][0];
    66             int y=j+dir[k][1];
    67             
    68             if(x>=0&&x<3&&y>=0&&y<3){
    69                 char t=str1[pos];
    70                 str1[pos]=str1[x*6+y*2];
    71                 str1[x*6+y*2]=t;
    72                 
    73                 if(encode(str1)){
    74                     if( (rear+1)%max == front)
    75                         return -1;
    76                     state[rear]=str1;
    77                     rear = (rear+1)%max;
    78                     temp++;
    79                 }
    80                 
    81             }
    82         }
    83         amt--;
    84     }
    85     return 0;
    86 }
    87 int main(){
    88     while( getline(cin,origion) && getline(cin,goal)){
    89         memset(vis,-1,sizeof(vis));
    90         cout<<bfs()<<endl;
    91     }    
    92 }
    93 /*
    94 2 6 4 1 3 7 0 5 8
    95 8 1 5 7 3 6 4 0 2
    96 */
  • 相关阅读:
    对数组对象处理及其他小问题
    前端面试题库
    题解 P3371 【【模板】单源最短路径】
    题解 P2403 【[DOI2010]所驼门王的宝藏】
    题解 P2283 【[HNOI2003]多边形】
    题解 P1074 【靶形数独 】
    题解 P1064 【金明的预算方案】
    题解 CH1813 【双栈排序】
    题解 CH1809 【匹配统计】
    题解 CH0805 【防线】
  • 原文地址:https://www.cnblogs.com/z-bear/p/8448790.html
Copyright © 2011-2022 走看看