HDU 1430 魔板
魔板
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4228 Accepted Submission(s): 1003
Problem Description
在魔方风靡全球之后不久,Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方块组成,每个方块颜色均不相同,可用数字1-8分别表示。任一时刻魔板的状态可用方块的颜色序列表示:从魔板的左上角开始,按顺时针方向依次写下各方块的颜色代号,所得到的数字序列即可表示此时魔板的状态。例如,序列(1,2,3,4,5,6,7,8)表示魔板状态为:
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
1 2 3 4
8 7 6 5
对于魔板,可施加三种不同的操作,具体操作方法如下:
A: 上下两行互换,如上图可变换为状态87654321
B: 每行同时循环右移一格,如上图可变换为41236785
C: 中间4个方块顺时针旋转一格,如上图可变换为17245368
给你魔板的初始状态与目标状态,请给出由初态到目态变换数最少的变换步骤,若有多种变换方案则取字典序最小的那种。
Input
每组测试数据包括两行,分别代表魔板的初态与目态。
Output
对每组测试数据输出满足题意的变换步骤。
Sample Input
12345678
17245368
12345678
82754631
Sample Output
C
AC
Author
LL
Source
Recommend
【思路】:
如果直接按初态12345678去bfs到终态17245368,是可以得到答案的,但是
每次都进行一次bfs的话,必定会导致TLE的出现,那么我们应该怎样去优化
这个题目呢?
我们考虑是不是可以先预处理出所有情况,直接一次bfs,然后询问就可以了
那这个该如何实现了
本来初态12345678
我们可以看成位置12345678
终态对应 1724368
其实这个例子不好
换个例子
初态
数值:14567238
位置:12345678
终态
数值:12345678
位置:16723458
然后我们按位置来bfs
就只要处理初态为12345678的bfs
然后每次去查询就可以了(手动滑稽)
就是我们将任何初态看成12345678
即那对应的位置去进行bfs,而不是拿数值
附上代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<map> #include<string> #include<queue> #define mem(x) memset(x,0,sizeof(x)) using namespace std; map<string,string>M; const int MAXN = 10; char flaga[MAXN];///标记12345678 对应 什么 //char flagb[MAXN]; char a[MAXN],b[MAXN]; typedef struct MYSTRING { string num; string step; } mystring; string movea(string w) { string temp=w; w[0]=temp[7]; w[7]=temp[0]; w[1]=temp[6]; w[6]=temp[1]; w[2]=temp[5]; w[5]=temp[2]; w[3]=temp[4]; w[4]=temp[3]; return w; } string moveb(string w) { string temp=w; w[0]=temp[3]; w[1]=temp[0]; w[2]=temp[1]; w[3]=temp[2]; w[7]=temp[4]; w[6]=temp[7]; w[5]=temp[6]; w[4]=temp[5]; return w; } string movec(string w) { string temp=w; w[5]=temp[2]; w[6]=temp[5]; w[1]=temp[6]; w[2]=temp[1]; return w; } queue<mystring>que; string ans="01234567"; string result; mystring from; void bfs() { from.num=ans; from.step=""; que.push(from); while(!que.empty()) { mystring begins=que.front(); que.pop(); if((M.count(begins.num)==0)) { ///begins.step只能是1 2 3 M[begins.num]=begins.step; } else { continue; } for(int i=1;i<=3;i++) { mystring ends; if(i==1) { ends.num=movea(begins.num); ends.step=begins.step+'A'; } else if(i==2) { ends.num=moveb(begins.num); ends.step=begins.step+'B'; } else if(i==3) { ends.num=movec(begins.num); ends.step=begins.step+'C'; } que.push(ends); } } } int main() { bfs(); //ans=movea(ans); //cout<<ans<<endl; while(~scanf("%s %s",&a,&b)) { string c; c.clear(); mem(flaga); int lena=strlen(a); for(int i=0; i<lena; i++) { flaga[i]=a[i]; } //printf("s=%s\n",flaga); int lenb=strlen(b); //printf("%s\n",b); for(int i=0; i<lenb; i++) { for(int j=0; j<lena; j++) { if(b[i]==flaga[j]) {//printf("%c %c %d\n",b[i],flaga[j],j); b[i]=j+'0'; break; } } } c.append(b); //ans=movea(ans); //cout<<c[1]<<endl; //cout<<c<<endl; cout<<M[c]<<endl; } return 0; }