• poj 1077(八数码)


    八数码问题有多种解法,本题解采用的是双向搜索

    View Code
      1 #include<iostream>
      2 #include<map>
      3 #include<string>
      4 #include<queue>
      5 #include<stdio.h>
      6 #include<string.h>
      7 using namespace std;
      8 structnode{
      9  stringsx;
     10  int pos;
     11 };
     12 
     13 int dir[4]={-3,1,3,-1};
     14 char ch1[4]={'u','r','d','l'};
     15 char ch2[4]={'d','l','u','r'};
     16 int fact[9]={1,1,2,6,24,120,720,5040,40320};
     17 int b[500050]={0};
     18 stringsstr[500050];
     19 int hash(stringstr)
     20 {
     21     int sum=0;
     22     for(int i=1;str[i];i++)
     23     {
     24         int cnt=0;
     25         for(int j=0;j<i;j++)
     26         if(str[i]<str[j])cnt++;
     27         sum+=cnt*fact[i];
     28     }
     29     return sum;
     30 }
     31 stringbfs(stringstr)
     32 {
     33     memset(b,0,sizeof(b));
     34     queue<node>q1,q2;
     35     nodein;
     36     in.sx=str;
     37     for(int i=0;str[i];i++){if(str[i]=='9')in.pos=i;}
     38     q1.push(in);
     39     b[hash(str)]=1;
     40     in.sx="123456789";
     41     in.pos=8;
     42     q2.push(in);
     43     b[hash(in.sx)]=2;
     44     while(!q1.empty()&&!q2.empty())
     45     {
     46         nodeu=q1.front();
     47         q1.pop();
     48         int f=hash(u.sx);
     49         for(int i=0;i<4;i++)
     50         {
     51             nodev;
     52             v.pos=u.pos+dir[i];
     53             if((u.pos<3&&i==0)||(u.pos%3>1&&i==1)||
     54                (u.pos/3>1&&i==2)||(u.pos%3<1&&i==3))
     55             continue;
     56             v.sx=u.sx;
     57             v.sx[v.pos]=u.sx[u.pos];
     58             v.sx[u.pos]=u.sx[v.pos];
     59             int t=hash(v.sx);
     60             if(b[t]==1)continue;
     61             else if(b[t]==2)return sstr[f]+ch1[i]+sstr[t];
     62             sstr[t]=sstr[f]+ch1[i];
     63             b[t]=1;
     64             q1.push(v);
     65         }
     66         u=q2.front();
     67         q2.pop();
     68         f=hash(u.sx);
     69         for(int i=0;i<4;i++)
     70         {
     71             nodev;
     72             v.pos=u.pos+dir[i];
     73             if((u.pos<3&&i==0)||(u.pos%3>1&&i==1)||
     74                (u.pos/3>1&&i==2)||(u.pos%3<1&&i==3))
     75             continue;
     76             v.sx=u.sx;
     77             v.sx[v.pos]=u.sx[u.pos];
     78             v.sx[u.pos]=u.sx[v.pos];
     79             int t=hash(v.sx);
     80             if(b[t]==2)continue;
     81             else if(b[t]==1)return sstr[t]+ch2[i]+sstr[f];
     82             sstr[t]=ch2[i]+sstr[f];
     83             b[t]=2;
     84             q2.push(v);
     85         }
     86     }
     87     return "unslovable";
     88 }
     89 int main()
     90 {
     91     memset(b,0,sizeof(b));
     92     char s[110];
     93     while(gets(s))
     94     {
     95         stringstr="";
     96         for(int i=0;s[i];i++)
     97         {
     98             if(s[i]>='0'&&s[i]<='9')str=str+s[i];
     99             else if(s[i]=='x')str=str+'9';
    100         }
    101         int i=0;
    102         cout<<bfs(str)<<endl;
    103     }
    104     return 0;
    105 }
  • 相关阅读:
    [注]打动我的50句广告语
    [SD.TEAM语录]AC语录
    [SD.TEAM语录]阿翔语录
    [安卓基础] 009.组件Activity详解
    [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
    [Python自学] day-20 (Django-ORM、Ajax)
    [Python自学] day-19 (2) (Django-ORM)
    [Python自学] day-19 (1) (FBV和CBV、路由系统)
    [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)
    [Python自学] day-18 (1) (JS正则、第三方组件)
  • 原文地址:https://www.cnblogs.com/huangriq/p/2446941.html
Copyright © 2020-2023  润新知