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

    oj上简化的八数码问题,最强的数据仅仅是20步;

    根据曼哈顿距离构造启发函数;

    主算法:IDA*;(使用方法好像不太对......)

    未用位运算优化;

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<string>
     6 #include<ctime>
     7 #include<cmath>
     8 #include<set>
     9 #include<map>
    10 #include<queue>
    11 #include<algorithm>
    12 #include<iomanip>
    13 #include<queue>
    14 using namespace std;
    15 #define FILE "dealing"
    16 #define up(i,j,n) for(int i=(j);i<=(n);i++)
    17 #define pii pair<int,int>
    18 #define LL long long
    19 namespace IO{
    20     char buf[1<<15],*fs,*ft;
    21     int gc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?-1:*fs++;}
    22     int read(){
    23         int ch=gc(),f=0,x=0;
    24         while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=gc();}
    25         while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=gc();}
    26         return f?-x:x;
    27     }
    28 }using namespace IO;
    29 const int maxn=10;
    30 char ch[maxn],en[maxn]={'1','2','3','8','0','4','7','6','5'};
    31 int a[3][3];
    32 int p[10][10]={
    33 {0,1,2,1,2,3,2,3,4},
    34 {1,0,1,2,1,2,3,2,3},
    35 {2,1,0,3,2,1,4,3,2},
    36 {1,2,3,0,1,2,1,2,3},
    37 {2,1,2,1,0,1,2,1,2},
    38 {3,2,1,2,1,0,3,2,1},
    39 {2,3,4,1,2,3,0,1,2},
    40 {3,2,3,2,1,2,1,0,1},
    41 {4,3,2,3,2,1,2,1,0}
    42 };
    43 int x[10],y[10];
    44 inline int check(int a[][3]){
    45     int ans=0;
    46     up(i,1,3)x[a[0][i-1]]=i-1;
    47     up(i,4,6)x[a[1][i-4]]=i-1;
    48     up(i,7,9)x[a[2][i-7]]=i-1;
    49     up(i,0,8)ans+=p[x[i]][y[i]];
    50     return ans;
    51 }
    52 const int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
    53 bool flag=0;
    54 int ans=10000;
    55 int MaxH=0;
    56 void dfs(int a[][3],int d){
    57     int xx,yy;
    58     xx=check(a);
    59     if(!xx){flag=1;ans=min(ans,d);return;}
    60     if(d+xx>MaxH)return;
    61     up(i,0,2)up(j,0,2){
    62         if(a[i][j])continue;
    63         up(k,0,3){
    64             xx=i+dx[k],yy=j+dy[k];
    65             if(xx<0||yy<0||xx>2||yy>2)continue;
    66             swap(a[xx][yy],a[i][j]);
    67             dfs(a,d+1);
    68             swap(a[xx][yy],a[i][j]);
    69         }
    70     }
    71     return;
    72 }
    73 int main(){
    74     freopen(FILE".in","r",stdin);
    75     freopen(FILE".out","w",stdout);
    76     scanf("%s",ch);
    77     up(i,0,8)y[en[i]-'0']=i;
    78     up(i,1,3)a[0][i-1]=ch[i-1]-'0';up(i,4,6)a[1][i-4]=ch[i-1]-'0';up(i,7,9)a[2][i-7]=ch[i-1]-'0';
    79     for(int i=2;;i+=2){
    80         MaxH=i;
    81         dfs(a,0);
    82         if(flag)break;
    83     }
    84     printf("%d
    ",ans);
    85     cout<<"The time has passed "<<clock()<<" ms."<<endl;
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    NStimer 被堵塞
    零基础学python-7.6 字符串格式化表达式
    实验记录三 通用输入输出(GPIO)
    VTK的安装配置-使用VS2010
    Python 查找Twitter中特定话题中最流行的10个转发Tweet
    ios开发之-计算器的改进
    彻查网络局部网段内Ping时断时续的问题
    hdoj-1016-Prime Ring Problem【深搜】
    WebView的截屏实现
    CentOs虚拟机能够互相ping通,但无法訪问虚拟机服务
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6109232.html
Copyright © 2011-2022 走看看