洛谷 P1379 八数码难题

来源:互联网 发布:德勤monitor知乎 编辑:程序博客网 时间:2024/05/17 02:06
P1379 八数码难题

题目描述

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入输出格式

输入格式:

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

输出格式:

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据)

输入输出样例

输入样例#1:
283104765
输出样例#1:
4
 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<map> 5 using namespace std; 6 map <string,int>v; 7 map <string,int>step; 8 int a,b,t,head=0,tail=0; 9 int bh[]={-3,-1,1,3},wz[100000],tou[100000];10 string s,rs("123804765"),dl[100000],ns;11 int main(){12     cin>>s;13     a=s.find('0');14     wz[head]=a;tou[head]=1;dl[head++]=s;15     wz[head]=4;tou[head]=2;dl[head++]=rs;16     v[s]=1;17     while(tail<=head){18         a=wz[tail];19         t=tou[tail];20         s=dl[tail++];21         b=step[s];22         for(int i=0;i<4;i++){23             ns=s;24             if(i==0&&a>2){25                 ns[a]=s[a+bh[i]];ns[a+bh[i]]=s[a];26             }27             if(i==1&&a!=0&&a!=3&&a!=6){28                 ns[a]=s[a+bh[i]];ns[a+bh[i]]=s[a];29             }30             if(i==2&&a!=2&&a!=5&&a!=8){31                 ns[a]=s[a+bh[i]];ns[a+bh[i]]=s[a];32             }33             if(i==3&&a<6){34                 ns[a]=s[a+bh[i]];ns[a+bh[i]]=s[a];35             }36             if(v[ns]!=t){37                 if(!v[ns]){38                     v[ns]=t;wz[head]=a+bh[i];tou[head]=t;39                     dl[head++]=ns;step[ns]=b+1;40                 }41                 else{cout<<b+1+step[ns]<<endl;return 0;}    42             }43         }44     }45     return 0;46 }

鞠爷的,原来就没搞懂,这辈也不想搞懂了

0 0
原创粉丝点击