题目连接: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).

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J. Minimum Distance in a Star Graph 贪心/bfs_#include

 

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


题目来源

2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

 

 

题意:

给一个全排序,每次允许第一个数字和后面的随便一个数字交换,让你求可以达到目标串的最小交换次数。

分析:

贪心

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;
}