这题题意很好理解,就是给定模版,然后每次输入一个例子,计算出转换成模版所需的路径。
题目链接: 题目
题目思路如下:
- 先将模版确定,并用DFS将所有可能移动到模版的情况的路径都统计出来。
- 输入给出的例子,并从所有的情况中找出对应的路径输出
代码如下:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string>
#include<map>
#include<queue>
using namespace std;
map<string,string>M;
queue<string> q;
int main()
{
string gold="12345678x";
map<string,string>::iterator my_it;
bool flag[8];
int n;
int a[4]={1,-1,3,-3};
q.push(gold);
M[gold]=gold;
while(!q.empty())
{
n=0;
string s=q.front();
q.pop();
while(s[n]!='x')
{
n++;
}
string ts;
for(int i=0;i<2;i++)
{
ts=s;
if(n%3+a[i]>2||n%3+a[i]<0) continue;
int tx=n+a[i];
char tc;
tc=ts[tx];
ts[tx]=ts[n];
ts[n]=tc;
my_it = M.find(ts);
if(my_it==M.end())
{
q.push(ts);
M[ts]=s;
}
}
for(int i=2;i<4;i++)
{
ts=s;
if(n+a[i]>=8||n+a[i]<0) continue;
int tx=n+a[i];
char tc;
tc=ts[tx];
ts[tx]=ts[n];
ts[n]=tc;
my_it = M.find(ts);
if(my_it==M.end())
{
q.push(ts);
M[ts]=s;
}
}
}
string is;
while(getline(cin,is))
{
int begin = 0;
begin = is.find(" ",begin); //查找空格在str中第一次出现的位置
while(begin != -1) //表示字符串中存在空格
{
is.replace(begin, 1, ""); // 用空串替换str中从begin开始的1个字符
begin = is.find(" ",begin); //查找空格在替换后的str中第一次出现的位置
}
my_it = M.find(is);
if(my_it==M.end())
{
cout<<"unsolvable"<<endl;
continue;
}
string str1,str2;
int w;
str2=is;
while(1)
{
str1=M[str2];
int ix=0,iy=0;
while(str1[ix]!='x')
{
ix++;
}
while(str2[iy]!='x')
{
iy++;
}
switch(ix-iy)
{
case 3:cout<<"d";break;
case 1:cout<<"r";break;
case -1:cout<<"l";break;
case -3:cout<<"u";break;
}
str2=str1;
if(str1==gold)
break;
}
cout<<endl;
}
return 0;
}