luogu_1379 八数码难题

八数码-->BFS+set

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<set>
  6 using namespace std;
  7 struct aaa{
  8     int map[4][4];
  9     int dep,x,y;
 10 }que[370000];
 11 set<int> ssr;
 12 int head=0,tail=1;
 13 int dx[5]={0,1,-1,0,0};
 14 int dy[5]={0,0,0, 1,-1};
 15 int start[4][4];
 16 int goal[4][4]={{0,0,0,0},{0,1,2,3},{0,8,0,4},{0,7,6,5}};
 17 int temp[4][4];
 18 char putt[15];
 19 long long ans;
 20 /*int judge()
 21 {
 22     int i,j,k;
 23     for(i=1;i<=tail;i++)
 24     {
 25         bool p=1;
 26         for(j=1;j<=3;j++)
 27             for(k=1;k<=3;k++)
 28                 if(que[i].map[j][k]!=temp[j][k])
 29                     p=0;
 30         if(p==1)
 31             return 0;
 32     }
 33     return 1;
 34 }*/
 35
 36 int judge()
 37 {
 38     long long num=0;
 39     int l,k;
 40     for(l=1;l<=3;l++)
 41         for(k=1;k<=3;k++)
 42             num=num*10+temp[l][k];
 43     pair<set<int>::iterator,bool>f=ssr.insert(num);
 44     return f.second;
 45 }
 46 int win(){
 47     int i,j;
 48     for(i=1;i<=3;i++)
 49         for(j=1;j<=3;j++)
 50             if(temp[i][j]!=goal[i][j])
 51                 return 0;
 52     return 1;
 53 }
 54 void bfs()
 55 {
 56     int i,j;
 57     memcpy(temp,start,sizeof (start));
 58     if(win())
 59          return;
 60     memcpy(que[tail].map,start,sizeof (start));
 61     for(i=1;i<=3;i++)
 62         for(j=1;j<=3;j++)
 63         {
 64             if(start[i][j]==0)
 65             {
 66                 que[tail].x=i;que[tail].y=j;
 67                 break;
 68             }
 69         }
 70
 71
 72     while(head<tail)
 73     {
 74         head++;
 75         for(i=1;i<=4;i++)
 76         {
 77             int newx=que[head].x+dx[i];
 78             int newy=que[head].y+dy[i];
 79             if(newx>=1&&newy>=1&&newx<=3&&newy<=3)
 80             {
 81                 memcpy(temp,que[head].map,sizeof(temp));//
 82                 swap(temp[newx][newy],temp[que[head].x][que[head].y]);
 83                 if(judge())
 84                 {
 85                     tail++;
 86                     que[tail].x=newx;
 87                     que[tail].y=newy;
 88                     memcpy(que[tail].map,temp,sizeof(temp));
 89                     que[tail].dep=que[head].dep+1;
 90                     if(win())
 91                     {
 92                         ans=que[tail].dep;
 93                         return;
 94                     }
 95                 }
 96             }
 97         }
 98     }
 99 }
100 int main()
101 {
102     int i,j;
103     scanf("%s",putt);
104     for(i=1;i<=9;i++)
105         start[(i-1)/3+1][(i-1)%3+1]=putt[i-1]-48;
106     bfs();
107     printf("%d",ans);
108     return 0;
109 }   

原文地址:https://www.cnblogs.com/oybdooo-ozai/p/10389394.html

时间: 2024-08-24 23:28:13

luogu_1379 八数码难题的相关文章

1225 八数码难题

1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765

洛谷【P1379】八数码难题

P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊

洛谷OJ P1379 八数码难题 解题报告

洛谷OJ P1379 八数码难题 解题报告 by MedalPluS 题目描述   在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变.   输入格式   输入初试状态,一行九个数字,空格用0表示   输出格式 只有一行,该行只有一个数字,表示从初始状态到

wikioi 1225 八数码难题 IDA*

为什么就是跑不出0ms 八数码0.0,我又来水博客了. IDA*算法,A*为曼哈顿距离,判重用康拓展开. #include<cstring> #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> using namespace std; int a[4][4]; int dx[]={0,0,-1,1}; int dy[]={-1,1,0,0}; char s

洛谷 P1379 八数码难题

P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入输出格式 输入格式: 输入初始状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊

codevs1225八数码难题(搜索&#183;)

1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最

双向广搜+hash+康托展开 codevs 1225 八数码难题

codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

八数码难题

[题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. [输入描述] 输入初试状态,一行九个数字,空格用0表示. [输出描述] 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据). [