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 n, an n−dimensional star graph, also referred to as Sn, is an undirected graph consisting of n! nodes (or vertices) and ((n−1) ∗ n!)/2 edges. Each node is uniquely assigned a label x1 x2 ... xnwhich is any permutation of the n digits 1,2,3,...,n. For instance, an 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. For each node with label x1 x2x3 x4 ... xn, it has n−1 edges connecting to nodes x2 x1 x3 x4 ... xn, x3 x2 x1 x4 ... xn, x4 x2 x3 x1 ... xn, ..., and xn x2 x3 x4 ... x1. That is, the n−1 adjacent nodes are obtained by swapping the first symbol and the d−th symbol of x1 x2 x3 x4 ... xn, for d=2,...,n. For instance, in S4, node 1234 has 3 edges connecting to nodes 2134, 3214, and 4231. The following figure shows how S4 looks (note that the symbols a, b, c, and d 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:
- n: the dimension of the star graph. We assume that n ranges from 4 to 9.
- Two nodes x1 x2 x3 ... xn and y1 y2 y3 ... yn in Sn.
You have to calculate the distance between these two nodes (which is an integer).
Input Format
n (dimension of the star graph)
A list of 5 pairs of nodes.
Output Format
A list of 5 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
题目来源
题意:就是先给你一个数n,接下来有 n 行,每行输入两个数位为 n 的数 s 和 t ,问 s 怎么用最小的步骤变成 t ,变化条件:s 在每一步都能变成 n - 1 个数,假设 s 的每一个数位分别是:x1, x2, x3, ......, xn,则在一个步骤中, s 的第一个数位的数能跟后面的每一个数位交换一次,例如 s 是四位数x1x2x3x4,则 s 第一步能变成:x2x1x3x4 , x3x1x2x4 , x4x1x2x3,这三个数。
题解:这道题用广搜做。
附代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
///o(っ。Д。)っ AC万岁!!!!!!!!!!!!!!
const int maxn = 100;
struct node
{
string book;
int s;
}star, eq;
queue<node>first;
int bfs(int n)
{
map<string, bool>maps;
first.push(star);
struct node exch, rec;
while(!first.empty())
{
rec = first.front();
first.pop();
for(int i = 0; i < n; i++)
{
exch = rec;
swap(exch.book[0], exch.book[i]);
exch.s = rec.s + 1;
if(exch.book == eq.book)
{
return exch.s;
}
if(!maps[exch.book])
{
first.push(exch);
maps[exch.book] = true; ///记得要保存每一次的变化,不然会爆内存
}
}
}
}
int main()
{
int n;
while(scanf("%d ", &n) != EOF)
{
char ch;
for(int i = 1; i <= 5; i++)
{
cin >> star.book;
cin >> eq.book;
star.s = eq.s = 0;
printf("%d\n", bfs(n));
while(!first.empty())
{
first.pop();
}
}
}
return 0;
}
/*
*/
本文介绍了一种特殊的图——星形图,并探讨了如何在该图中寻找两点间的最短距离。通过广度优先搜索算法,实现了高效计算任意两点间距离的方法。


被折叠的 条评论
为什么被折叠?



