pta 一笔画

小丁最近迷恋上一个游戏,传说中的“一笔画”游戏。那么什么是一笔画?如下图,顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中,笔不能离开纸,且笔所画过的线不能重复,最后画完所有的线便算完成。

1000.jpg

虽然小丁喜欢玩这个游戏,但有时候花费半天也找不到答案。小丁听说写一个计算机程序便能判断是否可以一笔画图,所以他希望善良可爱的你来帮帮他的忙。快来帮帮弱小,可怜,又无助的小丁。

输入格式:

给出图中的节点数N(1<=N<=1000,编号1-N)和边数M;随后M行给出存在边的两个节点的编号。

输出格式:

能够一笔画的图输出Y,否则输出N。

输入样例1:

3 2
1 2
2 3

输出样例1:

Y

输入样例2:

4 3
1 2
1 3
1 4

输出样例2:

N

思路分析:

         要判断是否可以一笔画完,我们只需要知道某一个点是否可以访问到其它所有点(通过已有的路径),那么对每个点进行回溯判断,如果该节点访问到了所有节点则直接判断结束。

 代码如下:(分析代码中给出)

#include<bits/stdc++.h>
using namespace std;
int xia[1002][1003] = { 0 };
int n, m,con=0;
int* tips;
void dfs(int k, int n)
{
	tips[k] = 1;//该点被访问
	con++;
	for (int i = 1; i <= n; i++) {
		if (xia[k][i] != 0 && tips[i] == 0) {//如果还有路径就接着向下走
			dfs(i, n);
			break;
		}
	}//走完就判断下是不是全走完了,全走完就直接退出,没有就接着递归
	if (con == n) { cout << "Y"; exit(0); }//访问到的点个数等于总共点个数则成功
	con--;
	tips[k] = 0;
	
}
int main() {

	cin >> n >> m;
	tips = new int[n + 2]();
	int a1, a2;
	for (int i = 0; i < m; i++) {
		cin >> a1 >> a2;
		xia[a1][a2]++;
		xia[a2][a1]++;
	}//连接
	for (int i = 1; i <= n; i++) {
		dfs(i, n);//判断每一个点是否可以成功一笔画完
	}
	cout << "N";//最后都未能成功则失败
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值