华为OJ(笔画)

来源:互联网 发布:诚邀辣妹 网络性与爱 编辑:程序博客网 时间:2024/04/28 06:20

描述

一笔画游戏是一个数学游戏  即平面上由多条线段构成的一个图形能不能一笔画成,使得在每条线段上都不重复?例如汉字‘日’和‘中’字都可以一笔画的,而‘田’和‘目’则不能。


请编程实现一笔画:

首先输入坐标系上的点数个数,然后输入点的坐标,请判断这张图是否可以一笔画出,并输出画线顺序 (每条线段必须经过一次,且只能经过一次。每个端点可以经过多次。)

当有多种方式可以完成一笔画时,每一步都必须尽可能先画数值最小的端点。

如  输入 1,2  1,3 2,3 三个点



画线顺序为:1 2 3 1

如果能画线输出true

其他输出false;

知识点链表,队列,栈,树,图,数组运行时间限制10M内存限制128输入

1、输入点的个数

2、输入点的坐标

输出

如果可以一笔画这输出 画线顺序


样例输入3 1 2 1 3 2 3样例输出true看OJ下面的评论都说这个题描述是错误的,反正我提交也没有通过,用的思路:

欧拉定理   如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
 
判断一笔画的方法: 
①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
 
②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
#include<iostream>#include<string>using namespace std;bool **p;bool *con;int *cnt;void DFS(int cur,int n){con[cur]=true;for(int i=1;i<=n;i++)if(p[cur][i]){cnt[cur]++;if(!con[i])DFS(i,n);}}bool connect(int n){for(int i=1;i<=n;i++)if(!con[i])return false;return true;}int main(){int n,m;cin>>n;m=n+1;p=new bool*[m];for(int i=0;i<=n;i++){p[i]=new bool[m];memset(p[i],false,m*sizeof(bool));}con=new bool[m];cnt=new int[m];memset(con,false,m*sizeof(bool));memset(cnt,0,m*sizeof(int));int a,b;for(int i=0;i<n;i++){cin>>a>>b;p[b][a]=p[a][b]=true;}DFS(1,n);bool flag=connect(n);int oddnum=0;if(!flag)cout<<"false"<<endl;else{for(int j=1;j<=n;j++)if(cnt[j]%2)oddnum++;if(oddnum==0||oddnum==2)cout<<"true"<<endl;elsecout<<"false"<<endl;}for(int i=0;i<m;i++)delete [] p[i];delete [] p;delete [] con;delete [] cnt;//system("pause");return 0;}



1 0
原创粉丝点击