题目连接:https://nanti.jisuanke.com/t/A1286
In this problem, we will define a graph called star graph, and the question is to find the minimum distance between two given nodes in the star graph.
Given an integer nn, an n-dimensionaln−dimensional star graph, also referred to as S_{n}Sn, is an undirected graph consisting of n!n! nodes (or vertices) and ((n-1)\ *\ n!)/2((n−1) ∗ n!)/2 edges. Each node is uniquely assigned a label x_{1}\ x_{2}\ ...\ x_{n}x1 x2 ... xnwhich is any permutation of the n digits {1, 2, 3, ..., n}1,2,3,...,n. For instance, an S_{4}S4 has the following 24 nodes {1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321}1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431,3124,3142,3214,3241,3412,3421,4123,4132,4213,4231,4312,4321. For each node with label x_{1}\ x_{2} x_{3}\ x_{4}\ ...\ x_{n}x1 x2x3 x4 ... xn, it has n-1n−1 edges connecting to nodes x_{2}\ x_{1}\ x_{3}\ x_{4}\ ...\ x_{n}x2 x1 x3 x4 ... xn, x_{3}\ x_{2}\ x_{1}\ x_{4}\ ...\ x_{n}x3 x2 x1 x4 ... xn, x_{4}\ x_{2}\ x_{3}\ x_{1}\ ...\ x_{n}x4 x2 x3 x1 ... xn, ..., and x_{n}\ x_{2}\ x_{3}\ x_{4}\ ...\ x_{1}xn x2 x3 x4 ... x1. That is, the n-1n−1 adjacent nodes are obtained by swapping the first symbol and the d-thd−th symbol of x_{1}\ x_{2}\ x_{3}\ x_{4}\ ...\ x_{n}x1 x2 x3 x4 ... xn, for d = 2, ..., nd=2,...,n. For instance, in S_{4}S4, node 12341234 has 33 edges connecting to nodes 21342134, 32143214, and 42314231. The following figure shows how S_{4}S4 looks (note that the symbols aa, bb, cc, and dd are not nodes; we only use them to show the connectivity between nodes; this is for the clarity of the figure).
In this problem, you are given the following inputs:
- nn: the dimension of the star graph. We assume that nn ranges from 44 to 99.
- Two nodes x_{1}x1 x_{2}x2 x_{3}x3 ... x_{n}xn and y_{1}y1 y_{2}y2 y_{3}\ ...\ y_{n}y3 ... yn in S_{n}Sn.
You have to calculate the distance between these two nodes (which is an integer).
Input Format
nn (dimension of the star graph)
A list of 55 pairs of nodes.
Output Format
A list of 55 values, each representing the distance of a pair of nodes.
样例输入复制
4 1234 4231 1234 3124 2341 1324 3214 4213 3214 2143
样例输出复制
1 2 2 1 3
题目来源
题意:
给一个全排序,每次允许第一个数字和后面的随便一个数字交换,让你求可以达到目标串的最小交换次数。
分析:
贪心
s1要变到s2,因为我们只能从s1[0]与其他位置变化,所以我们可以有两种策略。
- 如果s1[0]!=s2[0],则将s1[0]换到正确位置
- 否则找到第一个s1[i]与s2[i]不同的位置,将它与s1[0]交换
BFS
直接暴力搜索
贪心:2ms
#include<bits/stdc++.h>
using namespace std;
int n;
bool fail(string s1,string s2)
{
for(int i=0; i<n; i++)
if(s1[i]!=s2[i])
return true;
return false;
}
int main()
{
string s1,s2;
cin>>n;
int right[130];
for(int i=1; i<=5; i++)
{
cin>>s1>>s2;
for(int j=0;j<n;j++)
right[s2[j]-'0']=j;
int ans=0;
while(fail(s1,s2))
{
if(s1[0]!=s2[0])
{
ans++;
int pos=right[s1[0]-'0'];
swap(s1[0],s1[pos]);
}
else
{
ans++;
for(int j=1;j<n;j++)
{
if(s1[j]!=s2[j])
{
int pos=right[s1[j]-'0'];
swap(s1[0],s1[pos]);
break;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
BFS:199ms
#include<bits/stdc++.h>
using namespace std;
string s1, s2;
int n;
struct Node
{
string str;
int times;
}now,nex;
int bfs()
{
queue<Node> q;
map<string,int> mp;
q.push({s1,0});
mp[s1]=1;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=1;i<n;i++)
{
swap(now.str[0],now.str[i]);
nex.str=now.str;
nex.times=now.times+1;
if(nex.str==s2)
{
return nex.times;
}
if(mp[nex.str]==0)
{
q.push(nex);
mp[nex.str]=1;
}
swap(now.str[0],now.str[i]);
}
}
}
int main()
{
cin >> n;
for(int i = 0 ; i < 5 ; i++)
{
cin >> s1>> s2;
cout << bfs() << endl;
}
return 0;
}