CSU 1460: Kastenlauf

本文解析了一道名为Kastenlauf的编程竞赛题,该题要求判断角色是否能从起点抵达终点,途中每50米需获取饮料补给。文章提供了使用DFS和BFS算法解决此问题的具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSU 1460: Kastenlauf

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 110  Solved: 35
[Submit][Status][Web Board]

Description

Input

Output

Sample Input

220 01000 01000 10002000 100020 01000 02000 10002000 2000

Sample Output

happysad

 

 

 

思路分析:

题目的意思是说在一个矩形城市中,有一个人要从一点到达另一点,而且这个人每隔50m就要喝一瓶饮料,要不然就会死,路途中有若干个商店提供饮料,出发时该人身上有20瓶饮料,他经过商店时最多可以买20瓶,问这个人能否到达目的地(这个人要按照Manhattan距离走,不能走对角线)。

基本的搜索题,从起点到终点搜索,即DFSBFSDFS可由递归或者非递归(栈结构)实现,BFS由队列实现。要注意的就是跳出搜索的条件要把握好,否则会一直搜下去。。。。。

代码如下:

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <cstring>

#include <map>

#include <set>

#include <stack>

#include <queue>

#include <list>

#include <vector>

#include <algorithm>

using namespace std;

struct node

{

    int x;

    int y;

}a[120],b;

int visited[120];//访问标记

int n;

void dfs_recursion(int m)

{

    if (visited[m])

        return;//如果该点被访问过则返回上一层递归或跳出递归

    visited[m]=1;

    for (int i=0;i<n+2;i++)

        if (abs(a[m].x-a[i].x)+abs(a[m].y-a[i].y) <= 20)//如果满足曼哈顿距离不大于20m,则搜索下一个点

            dfs_recursion(i);

}

int dfs_stack(int m)

{

    stack<node> s;

    int i;

    struct node p;

    visited[m]=1;

    s.push(a[m]);

    while (!s.empty())

    {

        if (visited[n+1])

            return 1;

        p=s.top();

        for (i=1;i<n+2;i++)

        {

            if (visited[i] == 0 && abs(p.x-a[i].x)+abs(p.y-a[i].y) <= 20)

            {

                visited[i]=1;

                s.push(a[i]);

                break;//如果按顺序找到了和p点满足题目条件的一个点,则跳出该循环,并将找到的该点置成下一次循环的p点(栈顶元素)

            }

        }

        if (i == n+2)

            s.pop();//当栈顶的点不能与其他未被访问的所有点满足题目条件,则把该点弹出

 

 

    }

    return 0;

}

int bfs(int m)

{

    queue<node> q;

    int i;

    struct node p;

    visited[m]=1;

    q.push(a[m]);

    while (!q.empty())

    {

        if (visited[n+1])

            return 1;

        p=q.front();

        q.pop();

        for (i=1;i<n+2;i++)

            if (visited[i] == 0 && abs(p.x-a[i].x)+abs(p.y-a[i].y) <= 20)

            {

                visited[i]=1;

                q.push(a[i]);//将与点p满足条件的所有未被访问的点都找出来,然后依次入队列

            }

 

    }

    return 0;

}

int main()

{

    int t;

    while (scanf("%d",&t) != EOF)

    {

        while (t--)

        {

            int l,k;

            scanf("%d",&n);

            for (int i=0;i<n+2;i++)

            {

                cin>>l>>k;

                a[i].x=l/50;

                a[i].y=k/50;//先对数据预处理

            }

            memset(visited,0,sizeof(visited));

            if (bfs(0) == 1)

                cout<<"happy"<<endl;

            else

                cout<<"sad"<<endl;

 

        }

    }

    return 0;

}

 

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值