问题描述
西西艾弗岛上共有
个仓库,依次编号为 。每个仓库均有一个
维向量的位置编码,用来表示仓库间的物流运转关系。
具体来说,每个仓库
均可能有一个上级仓库 ,满足:仓库 位置编码的每一维均大于仓库 位置编码的对应元素。比如编码为 的仓库可以成为 的上级,但不能成为 的上级。如果有多个仓库均满足该要求,则选取其中编号最小的仓库作为仓库 的上级仓库;如果没有仓库满足条件,则说明仓库
是一个物流中心,没有上级仓库。
现给定
个仓库的位置编码,试计算每个仓库的上级仓库编号。
输入格式
从标准输入读入数据。
输入共
行。
输入的第一行包含两个正整数
和
,分别表示仓库个数和位置编码的维数。
接下来
行依次输入 个仓库的位置编码。其中第 行()包含 个整数,表示仓库
的位置编码。
输出格式
输出到标准输出。
输出共
行。
第
行()输出一个整数,表示仓库 的上级仓库编号;如果仓库 没有上级,则第 行输出 。
#include<iostream>
using namespace std;
int a[1000][1000];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
for(int i=1;i<=n;i++)
{
bool flag2=false;
for(int j=1;j<=n;j++)
{
bool flag=true;
if(i==j) continue;
for(int k=1;k<=m;k++)
{
if(a[j][k]>a[i][k])
{
continue;
}
else
{
flag=false;
break;
}
}
if(flag)
{
flag2=true;
cout<<j<<endl;
break;
}
}
if(!flag2)
{
cout<<0<<endl;
}
}
return 0;
}
讲解:
int a[1000][1000]
这里定义了一个二维数组a
,用于存储仓库的位置编码。数组的大小是1000x1000,意味着最多可以有1000个仓库(编号从1到1000),每个仓库的位置编码有1000个维度。
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>a[i][j];
}
从标准输入读取两个整数n
和m
,分别表示仓库的数量和位置编码的维度数。
读取每个仓库的位置编码,并存储在ma
数组中。
for(int i=1; i<=n; i++)
{
bool flag2 = false;
for(int j=1; j<=n; j++)
{
bool flag = true;
if(i == j) continue;
for(int k=1; k<=m; k++)
{
if(a[j][k] > a[i][k])
{
continue;
}
else
{
flag = false;
break;
}
}
if(flag)
{
flag2 = true;
cout << j << endl;
break;
}
}
if(!flag2)
{
cout << 0 << endl;
}
}
在上述代码中,flag
是一个布尔型(bool
)变量,用于表示是否找到了满足条件的上级仓库。这里的 flag
实际上是 "flag"(标志)的缩写,用于标记当前检查的仓库 j
是否可能是上级仓库。
具体地说:
如果 flag
保持为 true
,则意味着在比较当前仓库 i
和另一个仓库 j
的位置编码时,j
的每一维都大于 i
的对应维。这表示 j
是一个可能的上级仓库。
如果在比较过程中发现任何一维不满足条件(即 j
的某一维不大于 i
的对应维),flag
会被设置为 false
,表示 j
不是 i
的上级仓库。
一旦 flag
变为 false
,内部循环会立即跳出,并继续检查下一个仓库 j
是否是 i
的上级仓库。如果某个 j
使 flag
保持为 true
,则输出 j
作为 i
的上级仓库,并将 flag2
(或更好的命名可能是 hasSupervisor
,表示是否有上级仓库)设置为 true
,表示已经找到了上级仓库。
最后,如果遍历完所有仓库后 flag2
(或 hasSupervisor
)仍然是 false
,则表示没有找到满足条件的上级仓库,因此输出 0
。