1142 Maximal Clique (25point(s)) - C语言 PAT 甲级

1142 Maximal Clique (25point(s))

A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted from https://en.wikipedia.org/wiki/Clique_(graph_theory))

Now it is your job to judge if a given subset of vertices can form a maximal clique.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers Nv (≤ 200), the number of vertices in the graph, and Ne, the number of undirected edges. Then Ne lines follow, each gives a pair of vertices of an edge. The vertices are numbered from 1 to Nv.

After the graph, there is another positive integer M (≤ 100). Then M lines of query follow, each first gives a positive number K (≤ Nv), then followed by a sequence of K distinct vertices. All the numbers in a line are separated by a space.

Output Specification:

For each of the M queries, print in a line Yes if the given subset of vertices can form a maximal clique; or if it is a clique but not a maximal clique, print Not Maximal; or if it is not a clique at all, print Not a Clique.

Sample Input:

8 10
5 6
7 8
6 4
3 6
4 5
2 3
8 2
2 7
5 3
3 4
6
4 5 4 3 6
3 2 8 7
2 2 3
1 1
3 4 3 6
3 3 2 1

Sample Output:

Yes
Yes
Yes
Yes
Not Maximal
Not a Clique

题目大意:

输入 N 个点,M 条边的一个无向图,K 次查询,每次查询给一个点集

  • 若所给点集中,若任意两个点都有边相连,称 Clique 点集
  • 若 Clique 点集不能再加入新的节点构成新的 Clique 点集,则称为 Maximal Clique

对于每次查询,判断点集是 Maximal,还是 Clique,或者不是 Clique

设计思路:

对于每次所给的点集

  • 在点集中的点,循环判断是否两两相连
    • 若是,则为 Clique,
      • 遍历不在点集中的点,看是否有点和 Clique 中的点均相连
        • 若没有,则为 Maximal
        • 若有,则可以确定仅仅是 Clique
    • 否则,Not a Clique
编译器:C (gcc)
include <stdio.h>

int main(void)
{
        int v[210][210];
        int nv, ne, m;
        int a, b, i, j;

        scanf("%d%d", &nv, &ne);
        for (i = 0; i < ne; i++) {
                scanf("%d%d", &a, &b);
                v[a][b] = 1;
                v[b][a] = 1;
        }
        int k, p[210], map[210] = {0};
        int clique, maximal;
        scanf("%d", &m);
        while (m--) {
                for (i = 0; i < 210; i++)
                        map[i] = 0;
                scanf("%d", &k);
                for (i = 0; i < k; i++) {
                        scanf("%d", &p[i]);
                        map[p[i]] = 1;
                }

                clique = 1;
                maximal = 1;
                for (i = 0; i < k; i++) {
                        if (clique == 0)
                                break;
                        for (j = i + 1; j < k; j++) {
                                if (v[p[i]][p[j]] == 0) {
                                        clique = 0;
                                        break;
                                }
                        }
                }
                if (clique) {
                        for (i = 1; i <= nv; i++) {
                                if (maximal == 0)
                                        break;
                                if (map[i] == 0) {
                                        for (j = 0; j < k; j++)
                                                if (v[p[j]][i] == 0)
                                                        break;
                                        if (j == k)
                                                maximal = 0;
                                }
                        }
                }

                if (clique == 0)
                        printf("Not a Clique\n");
                else if (maximal == 0)
                        printf("Not Maximal\n");
                else
                        printf("Yes\n");
        }
        return 0;
}
<think>好的,用户需要查找Godot引擎中2D人物移动的代码示例。首先,我需要回忆一下Godot的基本结构和脚本语言。Godot主要使用GDScript,类似于Python,所以代码结构应该比较简洁。 用户的问题是关于2D角色移动的,可能需要处理输入、更新位置以及可能的物理效果。根据之前的知识,Godot的KinematicBody2D节点适合处理物理碰撞和移动,所以应该推荐使用这个节点类型。 接下来要考虑如何获取输入。在Godot中,输入可以通过Input类来处理,比如Input.get_action_strength或者Input.is_action_pressed。需要确定用户是否需要使用矢量移动还是分轴处理,通常水平垂直分开处理比较直观。 然后,移动部分需要考虑速度和delta时间。在_process或_physics_process函数中更新位置,使用move_and_slide方法可以让物理引擎处理碰撞,这样角色移动会更平滑。 可能还需要设置变量,比如速度、重力(如果涉及跳跃)等。如果用户需要基础的移动,可能不需要跳跃,但示例中加上重力会更全面,或者用户可能需要根据情况调整。 另外,用户可能会关心如何应用动画,比如根据移动方向切换精灵动画,这部分可能需要使用AnimatedSprite节点,并通过代码控制动画播放。 需要检查代码的正确性,比如是否正确使用Vector2,方法名是否正确,比如move_and_slide的参数是否正确传递。同时,要确保示例代码的简洁性,让用户容易理解。 可能还需要提到如何设置碰撞形状和节点结构,比如KinematicBody2D下需要有CollisionShape2D,以及精灵节点的添加。但用户可能只需要核心代码,所以可以简要说明节点结构,再给出脚本示例。 最后,考虑用户可能遇到的问题,比如输入映射的设置,是否需要预先在项目设置中定义动作,如“ui_left”、“ui_right”等,这些可能需要用户自行配置,所以在代码注释或说明中提到这一点会更好。 总结步骤:确定节点类型(KinematicBody2D),处理输入,计算移动向量,应用移动方法,处理碰撞,可能添加动画控制。确保代码示例完整,语法正确,并解释关键部分。</think>### Godot引擎实现2D角色移动的代码示例 在Godot中实现2D角色移动通常需要以下步骤: 1. 创建`KinematicBody2D`节点作为角色主体 2. 添加碰撞形状和精灵节点 3. 编写GDScript脚本处理输入和物理运动 ```gdscript extends KinematicBody2D # 移动参数配置 export var move_speed = 200 # 像素/秒 export var gravity = 980 # 重力加速度 export var jump_force = 400 # 跳跃力度 var velocity = Vector2.ZERO # 当前速度矢量 func _physics_process(delta): # 获取输入轴 var horizontal_input = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left") # 应用水平移动 velocity.x = horizontal_input * move_speed # 应用重力 velocity.y += gravity * delta # 跳跃检测 if is_on_floor() and Input.is_action_just_pressed("ui_up"): velocity.y = -jump_force # 执行移动并处理碰撞 velocity = move_and_slide(velocity, Vector2.UP) ``` #### 代码说明: 1. `move_and_slide()`方法会自动处理与环境的碰撞[^1] 2. `Vector2.UP`参数定义地面法线方向 3. 需要先在项目设置中配置输入映射: - `ui_left` → A键/左箭头 - `ui_right` → D键/右箭头 - `ui_up` → W键/空格键 #### 节点结构建议: ``` Player (KinematicBody2D) ├── CollisionShape2D (矩形/胶囊形) └── Sprite (角色贴图) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值