码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1718 图形复原

时间:2017-12-10 19:28:01      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:自动重启   几何   帮助   电脑   orange   badge   表示   style   blog   

题目描述

HWX小朋友对几何的热爱在电脑组是出了名的,号称“每题必解”,这天,LXC在玩logo的时候突然想到了一个题目,刚好可以去测试一下他封号的虚实,于是,他logo编程画了一个n边形,并且将n个顶点用1,2,3,…,n这n个连续自然数随手编了个号,为了增加难度,他又画了一些不相交的对角线。如下图:

他把所有的边和对角线都写在一张纸上,对于上图,他写了:(1,3),(3,2),(2,4),(4,5),(5,1),(1,4),(3,4)。正得意的时候,电脑突然自动重启了,郁闷的是,他忘记保存刚才的logo程序了,此刻的他很想利用纸上记录的信息将这个n边形的编号复原,电脑组的你能帮助他吗?

输入输出格式

输入格式:

 

第一行n(n<=50)

下面若干行,每行两个数a,b,表示纸上记录的信息。

 

输出格式:

 

仅一行,按字典序较小的顺序依次输出顶点的编号。对于上面的例子,你的输出应该是1 3 2 4 5。

 

输入输出样例

输入样例#1: 复制
5
1 3
3 2
2 4
4 5
5 1
1 4
3 4
输出样例#1: 复制
1 3 2 4 5
思路:搜索。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int ans[60],vis[60],map[60][60];
bool dfs(int now,int tot){
    if(tot==n+1&&now==1)    return true;
    for(int i=1;i<=n;i++)
        if(map[now][i]&&!vis[i]){
            vis[i]=1;map[now][i]=map[i][now]=0;ans[tot]=i;
            if(dfs(i,tot+1))    return true;
            vis[i]=0;map[now][i]=map[i][now]=1;
        }
    return false;
}
int main(){
    scanf("%d",&n);
    int a,b;
    while(scanf("%d%d",&a,&b)!=EOF)
        map[a][b]=map[b][a]=1;
    dfs(1,1);
    cout<<"1"<<" ";
    for(int i=1;i<n;i++)
        cout<<ans[i]<<" ";
}

 

 

洛谷 P1718 图形复原

标签:自动重启   几何   帮助   电脑   orange   badge   表示   style   blog   

原文地址:http://www.cnblogs.com/cangT-Tlan/p/8017754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!