C语言实现一笔画游戏判断

题目描述 我们现在玩一个游戏,名字就取作一笔画吧,规则是这样的:有一个连通的图,笔不离开纸面,可画过图中每条边仅一次,而且每条边都要画过一次,且可以回到起点,成功就是一笔画了。

输入 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。

输出 每个测试用例的输出占一行,若能成功一笔画则输出YES,否则输出NO。

样例输入 3 3 1 2 2 3 1 3 0 0

样例输出 YES

思路 判断图是否连通且度数为偶数。可以使用DFS或BFS遍历图,判断是否能够遍历到所有节点,同时统计每个节点的度数,最后判断是否所有节点的度数都为偶数。注意要在每个测试用例结束后清空数据。

参考代码

#include <stdio.h>
#include <stdlib.h>

#define MAXN 1000

int n, m;
int graph[MAXN][MAXN];
int visited[MAXN];
int degree[MAXN];

void dfs(int u) {
    visited[u] = 1;
    for (int v = 1; v <= n; v++) {
        if (graph[u][v] && !visited[v]) {
            dfs(v);
        }
    }
}

int main() {
    while (scanf('%d %d', &n, &m) != EOF && n != 0) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                graph[i][j] = 0;
            }
            visited[i] = 0;
            degree[i] = 0;
        }
        for (int i = 0; i < m; i++) {
            int u, v;
            scanf('%d %d', &u, &v);
            graph[u][v] = graph[v][u] = 1;
            degree[u]++;
            degree[v]++;
        }
        dfs(1);
        int flag = 1;
        for (int i = 1; i <= n; i++) {
            if (!visited[i]) {
                flag = 0;
                break;
            }
            if (degree[i] % 2 != 0) {
                flag = 0;
                break;
            }
        }
        if (flag) {
            printf('YES\n');
        } else {
            printf('NO\n');
        }
    }
    return 0;
}

原文地址: https://www.cveoy.top/t/topic/n8hX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录