矩阵轰炸游戏
导航
1>背景+要求
2>输入格式
3>分析以及算法
4>代码实现
主要利用基础知识数组和for循环以及if判断语句去完成该小游戏,都是平时练习所记如果有错误请多多包涵。
1>背景+要求
背景:现在有一个大小为NxM的城市,遭遇了X次轰炸,每次轰炸面积为和边界平行的矩形,在轰炸之后共有Y个关键点。
要求:现在指挥官需要了解他们有没有被轰炸,若有被轰炸几次,最后一次被轰炸是第几次
2>输入格式
输入格式:
第一行,四个整数:n、m、x、y (n、m表示城市的范围,x表示轰炸的总轮数,y表示关键点)
以下x行,每行四个整数:x1,y1,x2,y2,分别表示被轰炸的矩形的左上角和右下角坐标(例如:(1,3)(7,10)表示轰炸的地方为该两点于边界平行的矩形)
在以下y行输出关键点坐标
输出格式:
共y行每行第一个字符为Y或N(表示是否被轰炸),若为N则说明没有被轰炸,若为Y则说明被轰炸后面接轰炸计数和最后一次没轰炸是第几轮
3>分析以及算法
由于城市是一个矩形,每次被轰炸区域也是矩形,则可以使用数组进行存储。
- 用四个数组保存被轰炸的四角
- 输入x轮并用数组保存
- 统计和判断区域是否被轰炸
首先对与城市面积问题,不必要去建立一个二维数组(那需要很大的空间)可以定义四个一维的数组去保存四个角(或者定义一个结构体内部有四个变量)
定义初始变量,城市的面积-->轰炸的轮数以及关键点个数--->测试点的坐标(同时统计总个数和记录最后一次轰炸)
如果轰炸关键点在区间内及坐标必定满足:a >= x1[j] && a <= x2[j] && b >= y1[j] && b <= y2[j]
将初始需要的变量逐个输入--->其次输入每一轮轰炸的对角坐标--->然后输入目标的坐标--->统计数据(if--else判断输出)
所需数据:
n m:指矩阵的行和列
x:轰炸轮数
y:代表轰炸关键点的个数
x1[],y1[],x2[],y2[]:代表每轮轰炸的对角坐标,具体数目由x控制
a b:代表关键点的坐标,具体数目有y控制
number:总共轰炸轮数
last:最后一次轰炸的轮数
4>代码实现
在计算最后一轮轰炸时由于j=0,所以赋值输出之后需要进行先自增在输出
const int size = 1000;//定义一个比较大的范围
int x1[size], y1[size], x2[size], y2[size];//保存被轰炸的四角
int n, m, x, y, a, b;//定义初始化的变量
printf("请输入城市的行和列:");
scanf("%d %d",&n,&m);
printf("请输入轰炸轮数:");
scanf("%d",&x);
printf("输入目标点个数:");
scanf("%d",&y);
for (int i = 0; i < x; i++)
{
printf("第%d轮目标对角坐标:",i+1);
scanf("%d %d %d %d", &x1[i], &y1[i], &x2[i], &y2[i]);
}
int number = 0, last = 0;
for (int i = 0; i < y; i++)
{
printf("输入第%d个目标点:",i+1);
scanf("%d %d",&a,&b);
number = 0;
for (int j = 0; j < x; j++)
{
if (a >= x1[j] && a <= x2[j] && b >= y1[j] && b <= y2[j])
{
number++;
last = j;
}
}
if (!number)
printf("该区域没有被轰炸\n");
else
printf("该区域被轰炸%d轮最后一次轰炸为第%d轮\n", number, ++last);
}
修改数据测试: