没有合适的资源?快使用搜索试试~ 我知道了~
最小套圈设计问题课程设计
4星 · 超过85%的资源 需积分: 9 10 下载量 156 浏览量
2010-10-02
23:21:18
上传
评论 2
收藏 114KB DOC 举报
温馨提示
试读
16页
套圈游戏是游乐场中常见的游戏之一,其规则为:游戏者将手中的圆环套圈投向场中的玩具,被套中的玩具就作为奖品奖给游戏者。现给定一个套圈游戏场中的布局,固定每个玩具的位置,请你设计圆环套环的半径尺寸,使得它每次最多只能套中一个玩具。但同时为了让游戏看起来更具有吸引力,这个套圈的半径又需要尽可能大。为使问题进一步简化,假设每个玩具都是平面上一个没有面积的点,套圈是简单的圆。一个玩具被套住,是指这个点到圆心的距离严格小于圆半径。如果有两个玩具被放在同一个位置,那么输出的圆半径就是0。
资源推荐
资源详情
资源评论
计算机科学与技术系
课程设计报告
2008~2009 学年第二学期
课 程 数据结构与算法
课 程 设 计 名 称 最小套圈设计问题
学 生 姓 名
学 号
专 业 班 级
指 导 教 师
2009 年 5 月
1、问题分析和任务定义
一)问题分析
本设计的要求是设计一个最小套圈,来进行一项游戏——套圈游戏。
套圈游戏是游乐场中最常见的游戏之一,其规则为:游戏者将手中的圆环套圈投向场
中的玩具,被套中的玩具就作为奖品奖给游戏者。
次问题是给定一个套圈游戏场中的布局,固定每个玩具的位置。请你设计一个圆环套
圈的半径尺寸,使得它每次最多只能套中一个玩具,但同时为了让游戏看起来更具吸引力
这个套圈的半径又需要尽可能大。
为使问题进一步简化,假设每个玩具都是平面上一个没有面积的点。套圈是简单的圆 ,
一个玩具被套住,是指这个点到圆心的距离严格小于圆的半径。如果有两个玩具被放在同
一个位置,那么输出的圆半径就是零。
二)任务定义
(1)定义一个数据类型,使放置玩具的平面是一个矩阵(矩阵上的每个点都可以放
置玩具)。此数据类型含有表示玩具数目的数据项,表示矩阵行数和列数的数据项,表示
矩阵中 每个点的坐标的数据项等。(2)创建一个具有 t 个玩具的平面,放置玩具的点记
作 1,其余各点用 0 表示。(3)遍历矩阵中各点,求出数值为 1 的点间的最短距离,并取
其 1/2 作为套圈的半径。(4)判断是否有两个或两个以上的玩具放在同一点,若有两个
或两个以上的玩具放在同一点,那么套圈的半径就为 0。
2、数据结构的选择和概要设计
一)玩具的存储结构
将玩具的平面看作为一个矩阵,此矩阵式有 m*n 个数排列成一个 m 行(横向)n 列
(纵向)形成的矩阵数表:
a
11
a
12
┅ a
1n
a
21
a
22
┅ a
2n
A
m×n
= (1≤i≤m,1≤j≤n)
┇ ┇ a
ij
┇
a
m1
a
m2
┅ a
mn
称为 m×n 矩阵,其中 a
ij
为矩阵 A 的第 i 行第 j 列的元素。
定义一个包含以上信息的数据存储结构,并定义一个量,记录玩具的个数。
数据类型描述如下:
typedef struct
{ int x;
int y;
}Apoint[max];
typedef struct
{ Apoint point;
int m; //矩阵的行数
int n; //矩阵的列数
int t; //玩具个数
int edges[max][max];
}Spmatrix;
二)创建放置玩具平面的算法思想
(1)读入场地中玩具的个数。
(2)读入场地中玩具的坐标(包含横坐标 x 和纵坐标 y)和矩阵的行数和列数。
(3)给矩阵中各点赋值(放置玩具的点值为 1;其余各点值为 0)。
该算法实现的关键在于如何计算矩阵的行数和列数, 如何给矩阵中各点赋值(哪些
点值为 1,哪些点的值为 0)。具体操作如下:
(1)当程序提示,输入玩具数目时,就读入玩具的个数 t (正整数)。
(2)当程序提示,输入各个玩具的坐标时,就依次读入玩具的坐标的值(横坐标 x
和纵坐标 y 的值皆为自然数)。在此过程中并没有读入矩阵的行数和列数,那么,如何获
取其行数和列数的值呢?本程序中定义了两个数:a.记录读入的玩具的最大横坐标值的
m;
b.记录读入的玩具的最大纵坐标值的 n.
当读入玩具的坐标值完成后,即可读入矩阵的行数和列数,它们分别为(m+1)和(n+1)
(输入的玩具的横坐标 x 和纵坐标 y 皆可能为 0,所以矩阵的行数和列数应该为最大横坐
标加一和最大纵坐标加一)。
(3)为了方便给矩阵中各点赋值。本程序先将矩阵中的各点的数值置零,然后再将
第 x 行第 y 列的点的数值置 1。这样,矩阵中放置有玩具的点值为 1;其余各点值为 0(此
过程中,若有两个或两个以上的玩具放在同一点,其值也为 1。所以不能依次判断是否有
两个或两个以上的点位置相同)
三)判断是否有同位置的玩具算法思想
由于在给矩阵中各点赋值时,各点上不论是有一个玩具,还是 有两个以上的玩具,其
值都为 1,所以不能根据矩阵中各点的数值来判断某点上是否有两个或两个以上的玩具。
为了判断是否有两个以上的玩具放置在同一点上。本程序将各个玩具的横坐标 x 和
纵坐标 y 进行比较,判断它们是否相等。若有两个玩具的横坐标相等,且纵坐标也相等,
则有两个以上的玩具放置在同一点。
算法描述如下:
int repeat(Spmatrix *A)
{ int i,j;
for(i=0;i<A->t-1;i++)
for(j=i+1;j<A->t;j++)
if((A->point[i].x==A->point[j].x)&&(A->point[i].y==A->point[j].y))
return 1;
return 0;
}
四)计算套圈的半径的算法思想
若有两个或两个以上的玩具在同一点,则进行以下操作:
(1)从第一行第一列开始,判断矩阵中各点的值。若为零,跳过此点到下个点;若
为 1,进行以下(2)( 3)( 4)操作;
(2)判断本行中是否有值为 1 的点。如果有,计算它们的距离并用 D1 记录之,此
操作结束;
开 始
定义数据类型
输入 t
输入 x 和 y
m<x
m=x
n<
y
n=y
i<t
A->edges[i][j]==0
x==A->point[i].x
且 y==A-
>point[i].y
(3)计算出下一行中距离此点的最短距离,记为 D2。如果 D1>D2,那么
D1=D2,继续此操作;如果 D1<D2,此操作结束。
(4)判断最短距离 d 与 D1 的大小。如果 d>D1 ,那么 d=D1。
最小套圈的半径 R 为 d/2(以上操作中,矩阵以行序位主序存储的)。
五)结构图
六)流程图
N
Y
N
Y
Y
N
Main( )
Create( ) Banjin(spmatrix *A) Repeat(spmatrix *A)
剩余15页未读,继续阅读
资源评论
- qq_213638112015-05-21感觉还可以吧!可以借鉴!
keynes1988
- 粉丝: 10
- 资源: 67
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 采用P-f和Q-V滞控的去中心化逆变器型交流微电网的模拟(Simulink仿真实现)
- 彩虹聚合二级域名DNS管理系统源码v1.3
- 【TOF相机笔记3】Simulink使用方法
- 算法部署-基于C++和Python使用ONNXRuntime部署RT-DETR目标检测算法-附项目源码-优质项目实战.zip
- Bitree.cpp
- 改变浏览器大小,图片(img)内容居中显示
- 全景分割-基于FAIR-DETR对Cityscapes数据集进行微调实现全景分割-附项目源码-优质项目实战.zip
- Tru master.m4a
- 基于ELMAN神经网络的用气量预测,基于ELMAN的天然气消费量预测(代码完整,数据齐全)
- 基于Vue3+ThreeJS实现机械臂控制和预览+源码+开发文档+代码解析(高分优秀项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功