#include<iostream>
#include<vector>
#include<unordered_map>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int N;
unordered_map<string,bool>mp;
struct node{
string status;
int pos=-1;
vector<int>step;
};
string _swap(string s,int a,int b)
{
string temp=s;
char t=s[a];
temp[a]=s[b];
temp[b]=t;
return temp;
}
int main()
{
cin>>N;
string st,se;
for(int i=0;i<N;i++)
{
st=st+'1';
se=se+'2';
}
st=st+'0';
se=se+'0';
for(int i=0;i<N;i++)
{
st=st+'2';
se=se+'1';
}
//cout<<st<<endl<<se<<endl;
node start_node;
start_node.status=st;
start_node.pos=N;
start_node.step.push_back(N);;
queue<node>q;
q.push(start_node);
int dix[4]={-2,-1,1,2};
while(q.size())
{
node t=q.front();
q.pop();
if(t.status == se)
{
int cnt=0;
for(int i=1;i<t.step.size();i++)
{
if(cnt==4)
{
cout<<t.step[i]+1<<endl;
cnt=0;
}
else{
cout<<t.step[i]+1<<' ';
cnt++;
}
}
return 0;
}
for(int i=0;i<4;i++)
{
int next_tpos0=t.pos+dix[i];
if(next_tpos0>=0 && next_tpos0<N*2+1)
{
string next_status=_swap(t.status,t.pos,next_tpos0);
if(!mp[next_status])
{
mp[next_status]=1;
node next_node;
next_node.status=next_status;
next_node.pos=next_tpos0;
next_node.step=t.step;
next_node.step.push_back(next_tpos0);
q.push(next_node);
}
}
}
}
}
一维跳棋【计蒜客】
最新推荐文章于 2022-03-18 18:04:55 发布