CSP2023-12仓库规划

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文不同于题目所说的使用向量来求解问题,我们使用平易近人的二维数组。


问题描述

本题主体思路:输入数据→判断仓库 i 的上级仓库→ 记录,输出
(题目找不到,之后补上)

二、问题求解

1.建立模型

首先,将每个仓库设为二维数组的每一行,将每个仓库的的m维向量坐标设为二维数组的每一列,如图:在这里插入图片描述
之后将数组初始化为0(我感觉初不初始化都没什么问题)
自然地得到代码

int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
   for(int j=1;j<=m;j++){
      cin>>warehou[i][j];
   }
}      

2.判断仓库i的上级仓库

首先建立一个布尔函数用来判断两个数组的大小关系。
在这里我们建立两个一维数组 t_warehouse[101] 和 tt_warehouse[101]
在该函数中将两个数组在一个 for 循环中进行 m 次比较,每进行一次比较就用 YES和NO两个变量记录。
最后只有 YES=1 且 NO=0 的情况下返回 true .
详细代码如下:

bool yes_no(int m,int t_warehouse[],int tt_wraehouse){
  int YES=0,NO=0;
  for(int j=1;j<=m;j++){
      if(t_warehouse[j]<tt_warehouse[j]
          YES=1;
      else
          NO=1; 
  }
  if(YES==1&&NO==0)
    return true;
  else
    return false;         

然后在主函数中先给t_warehouse[ ] 赋值

for(int q=1;q<=n;q++){     //每一次遍历都是将 q 层的仓库与其他的每一个仓库(包括自己)进行大小比对 
    for(int j=1;j<=n;j++){
       t_warehouse[j]=warehouse[q][j];
    }
    //此处还有代码未列出
 }      

再设一个ans一维数组用来储存答案,并在每一次关于q的for循环中初始化为1002.
之后就可以开始将第q个仓库与i∈(1…n)的仓库比较。
以题给样例为例可得:

记得每次bool比较完后将数据记录进ans数组


输出说明

由于前面将ans数组初始化为1002,所以设minx=1001
将minx与每一个ans[i]进行比较,如果minx=1001,说明q这个仓库最大是物流中心
否则,就输出q的上级最小仓库。

代码

#include<iostream>

using namespace std;

//布尔函数判断大小关系
bool yes_no(int m, int t_warehouse[], int tt_warehouse[]) {
	int yes = 0, no = 0;
	for (int j = 1; j <= m; j++) {
		if (t_warehouse[j] < tt_warehouse[j])
		yes = 1;
		else 
			no= 1;
	}
	if (yes == 1 && no == 0)
		return true;
	else
		return false;
}

int main()
{
	int n, m;//分别为仓库数,维数
	cin >> n >> m;
	int warehouse[1001][11];//建立仓库的二维数组
	//输入
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> warehouse[i][j];
		}
	}
	int tt_warehouse[11], t_warehouse[11],ans[1001];//ans数组用来储存答案
	//每一次遍历都是将 q 层的仓库与其他的每一个仓库(包括自己)进行大小比对
	for (int q = 1; q <= n; q++) {
		//将 q 层的仓库维数额外储存
		for (int j = 1; j <= m; j++) {
			t_warehouse[j] = warehouse[q][j];
		}
		//给答案数组赋初值,方便去最小值
		for (int i = 1; i <= n; i++) {
			ans[i] = 1002;
		}
		//开始将第q个仓库与i∈(1..n)的仓库比较
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				tt_warehouse[j] = warehouse[i][j];
			}
			//如果满足则将该仓库编号录入ans数组
	        if (yes_no(m, t_warehouse, tt_warehouse))
				ans[i] = i;
		}
		int minx = 1001;
		//找最小
		for (int i = 1; i <= n; i++) {
			minx = min(minx, ans[i]);
		}
		if (minx == 1001)//如果q仓库是物流中心,那么答案数组里全是1002
			cout << "0" << endl;
		else
			cout << minx << endl;
	}
	return 0;
}

总结

这就是使用二维数组进行解题的方法,当然这题最佳的方法是使用向量。后面我会更新用向量的方法解题。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值