UVa12118 Inspector's Dilemma(欧拉道路)

Posted noble_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa12118 Inspector's Dilemma(欧拉道路)相关的知识,希望对你有一定的参考价值。

题目

题目
?


?

分析

很巧秒的一道题目,对着绿书瞎yy一会。
联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2。这样不断相加的和加上e再乘以t就是答案,
为什么呢?题目要求最短距离,那么必定是欧拉道路,那么为了构造出最短欧拉道路,要将奇度数的点减小至2个,然而各个道路不一定联通,还需要计算一下联通块数量n,结果加上n-1后,再乘t,因为需要n-1条边将各个联通块连接起来。
注意题目已保证每两个点都有路,所以上面才能那么肆无忌惮的连边。
?


?

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int q,dx[10]={2,2,-2,-2,1,-1,1,-1},dy[10]={1,-1,1,-1,2,2,-2,-2},ans=1<<15;
bool vis[11][11];
int x1,y1,x2,y2;
bool in(int x,int y){ return x>=1&&x<=8&&y>=1&&y<=8; }
void dfs(int x,int y,int num,int p)
{
    if(p>q) return;
    if(x==x2 && y==y2)
    {
        ans=min(ans,num);
        return;
    }
    for(int i=0;i<8;i++)
    {
        int px=x+dx[i],py=y+dy[i];
        if(!in(px,py) || vis[px][py]) continue;
    //  printf("(%d,%d) -> (%d,%d)\n",x,y,px,py);
        vis[px][py]=true;
        dfs(px,py,num+1,p+1);
        vis[px][py]=false;
    }
    return;
}
int main()
{
    char s1[20],s2[20];
//  freopen("1.txt","w",stdout);
    while(scanf("%s%s",s1,s2)==2)
    {
        memset(vis,0,sizeof(vis));
        ans=1<<15;q=0;
        y1=s1[0]-'a'+1; x1=s1[1]-'0';
        y2=s2[0]-'a'+1; x2=s2[1]-'0';
        vis[x1][y1]=true;
        while(ans==1<<15)
        {
            dfs(x1,y1,0,0);
            q++;
        }
        printf("To get from %s to %s takes %d knight moves.\n",s1,s2,ans);
    }
    return 0;
}

以上是关于UVa12118 Inspector's Dilemma(欧拉道路)的主要内容,如果未能解决你的问题,请参考以下文章

UVa12118 Inspector's Dilemma(欧拉道路)

6-14 Inspector s Dilemma uva12118(欧拉道路)

UVA12188-Inspector's Dilemma(欧拉回路+连通性判断)

UVa 10881Piotr's Ants

UVA10905 Children's Game

UVA10881 Piotr's Ants