八多少难点

作者: 编程应用  发布:2019-09-29

难点汇报Description

Yours和zero在研究A*启发式算法.得到一道杰出的A*标题,可是他们不会做,请您帮她们.
题目陈说

在3×3的棋盘上,摆有多个棋子,每一个棋子上标有1至8的某一数字。棋盘中留有八个空格,空格用0来代表。空格周围的棋类能够移到空格中。须要解的标题是:给出一种早先布局和目的布局(为了使难点轻便,设指标状态为123804765),找到一种最少步骤的移动方法,实现从开端布局到对象布局的变型。

输入描述Input Description

输入初试状态,一行九个数字,空格用0表示

输出描述Output Description

唯有一行,该行唯有一个数字,表示从上马状态到对象状态供给的起码运动次数(测量试验数据中无出奇无法达到目的状态数据)

样例输入萨姆ple Input

283104765

样例输出Sample Output

4

多少范围及提醒Data Size & Hint

详细试题

分类标签Tags点此张开

广搜+hash判重

  1 #include<iostream>  2 #include<cstdio>  3 #include<cstdlib>  4 using namespace std;  5 const int MAXN=5;  6 int xx[5]={-1,+1,0,0};  7 int yy[5]={0,0,-1,+1};  8 struct node  9 { 10     int mp[MAXN][MAXN]; 11 }a[100001]; 12 int hashfind[3733801]; 13 int step[200]; 14 int h=0,t=1; 15 int bc[MAXN][MAXN]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}}; 16 int hash() 17 { 18     int s=0; 19     int k=1; 20     for(int i=1;i<=3;i++) 21     { 22         for(int j=1;j<=3;j++) 23         { 24             s=s+a[t].mp[i][j]*k; 25             k=k*7; 26         } 27     } 28     s=s%3733801; 29     if(hashfind[s]==0) 30     { 31         hashfind[s]=1; 32         return 1; 33     } 34     else 35     { 36         return 0; 37     } 38 } 39 int check() 40 { 41     for(int i=1;i<=3;i++) 42     { 43         for(int j=1;j<=3;j++) 44         { 45             if(a[t].mp[i][j]!=bc[i][j]) 46             return 0; 47         } 48     } 49     return 1; 50 } 51 void move(int x,int y) 52 { 53      54     for(int i=0;i<4;i++) 55     { 56         int wx=x+xx[i]; 57         int wy=y+yy[i]; 58         if(wx>=1&&wx<=3&&wy>=1&&wy<=3) 59         { 60             for(int j=1;j<=3;j++) 61             { 62                 for(int k=1;k<=3;k++) 63                     { 64                         a[t].mp[j][k]=a[h].mp[j][k]; 65                     } 66             } 67             swap(a[t].mp[wx][wy],a[t].mp[x][y]); 68             step[t]=step[h]+1; 69             if==1) 70             { 71                 printf("%d",step[t]); 72                 exit(0);// end 73             } 74             if==1) 75             t++; 76         } 77     } 78 } 79 void bfs() 80 { 81     while(h<t) 82     { 83         for(int i=1;i<=3;i++) 84         { 85             for(int j=1;j<=3;j++) 86             { 87                 if(a[h].mp[i][j]==0) 88                 { 89                     move; 90                 } 91             } 92         } 93         h++; 94     } 95 } 96 int main() 97 { 98     char dr[10]; 99     int bgx=0;100     int bgy=0;101     gets;102     int now=0;103     for(int i=1;i<=3;i++)104     {105         for(int j=1;j<=3;j++)106         {107             a[0].mp[i][j]=dr[now]-48;108             if(a[0].mp[i][j]==0)109             {110                 bgx=i;111                 bgy=j;112             }113             now++;114         }115     }116     bfs();117     return 0;118 }

本文由今晚开什么码发布于编程应用,转载请注明出处:八多少难点

关键词:

上一篇:没有了
下一篇:没有了