2017 ACM-ICPC 亚洲区(南宁赛区)网络赛(J.Minimum Distance in a Star Graph)

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-dimensionalndimensional 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((n1)  n!)/2 edges. Each node is uniquely assigned a label x_{1}\ x_{2}\ ...\ x_{n}x1 x2 ... xn which 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-1n1 edges connecting to nodes x_{2}\ x_{1}\ x_{3}\ x_{4}\ ...\ x_{n}x2 x1 x3 x4 ... xnx_{3}\ x_{2}\ x_{1}\ x_{4}\ ...\ x_{n}x3 x2 x1 x4 ... xnx_{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-1n1 adjacent nodes are obtained by swapping the first symbol and the d-thdth 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 2134213432143214, and 42314231. The following figure shows how S_{4}S4looks (note that the symbols aabbcc, 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

题目大意:题目蛮长的,其实没什么内容,只看图和输入输出,这是与八数码类似的路径题,路径是每次可以有n-1种交换,第一个数与后面某位交换,照着之前那篇八数码的改了一下,就过了。。。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef int State[9];
const int maxstate=1000000;
State st[maxstate],goal;
int dist[maxstate];
int vis[362880],fact[9];
int n;
void init_lookup_table(){
    fact[0]=1;
    for(int i=1;i<=9;i++)
        fact[i]=fact[i-1]*i;
}
int try_to_insert(int s){
    int code =0;
    for(int i=0;i<n;i++){
        int cnt=0;
        for(int j=i+1;j<n;j++) if(st[s][j]<st[s][i]) cnt++;
        code +=fact[n-1-i]*cnt;
    }
    if(vis[code]) return 0;
    return vis[code] =1;
}
int bfs(){
    int front=1,rear=2;
    while(front<rear){
        State& s=st[front];
        if(memcmp(goal,s,sizeof(s))==0) return front;
        for(int d=1;d<n;d++)//第零位与后面的每一位一次交换
        {
            State& t=st[rear];
            memcpy (&t,&s,sizeof(s));
            t[d]=s[0];
            t[0]=s[d];
            dist[rear]=dist[front]+1;
            if(try_to_insert(rear)) rear++;//判重与记录

        }
        front++;
    }
    return 0;
}
int main()
{
    init_lookup_table();
    while(~scanf("%d",&n)){
        char str[9];
        for(int l=0;l<5;l++){
            memset(st,0,sizeof(st));
            memset(vis,0,sizeof(vis));
            memset(dist,0,sizeof(dist));
            scanf("%s",str);
            for(int i=0;i<n;i++)
                st[1][i]=int(str[i]-'1');
            scanf("%s",str);
            for(int i=0;i<n;i++)
                goal[i]=int(str[i]-'1');
            int ans=bfs();
            printf("%d\n",dist[ans]);
        }

    }



    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值