1.稀疏矩阵
问题描述
今天明明学到了什么叫做矩阵,但他发现要将一个矩阵输入进电脑是一件很麻烦的事。特别是有些矩阵很大,且大部分元素都是0,我们称这类矩阵为稀疏矩阵。 于是,明明发明了一种简单的表示方法,只指出矩阵中非零元素来表示该矩阵。
例如一个矩阵:
0 0 0 5
2 0 0 0
0 1 0 0
0 0 4 0
可以表示成:
1 4 5
2 1 2
3 2 1
4 3 4
但明明又开始力不从心了,于是再一次想到了你...
明明的问题可以归结为:试编程将一个稀疏矩阵a转换成只存放非零元素的矩阵b,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列以及它的值。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。
每组数据的第一行包括两个整数,M和N,用空格隔开,表示矩阵大小为M * N(1 ≤ M, N ≤ 20),之后的M行每行有N个整数,也用空格隔开,整数的大小不会超出int型,且必有一个数非零。行首行尾没有空格,每组测试数据之间也没有多余空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。对应每组输入数据,用明明的矩阵表示法输出该矩阵,即找出每个不是0的元素,按从左到右从上到下的顺序,输出其所在的行和列(行、列下标从1开始)以及它的值。其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int M,N;
int tag=1;//标记是否第一组
while(cin>>M>>N){
int a[21][21];
if(!tag)
cout<<endl;
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++)
cin>>a[i][j];
for(int i=1;i<=M;i++)
for(int j=1;j<=N;j++){
if(a[i][j]){
cout<<i<<" "<<j<<" "<<a[i][j]<<endl;
tag=0;
}
}
}
return 0;
}
2.矩阵转换
问题描述
明明是一个很聪明的孩子,学什么东西都很快。但是他也有个缺点,就是不愿意做重复的劳动,往往学会一样东西以后,就不太愿意再去碰它。有一天,明明在数学课上学了矩阵的转换,即有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行交换,然后形成一个新的矩阵。
例如:有个3×3的矩阵如下:
1 2 3
4 5 6
7 8 9
通过以左上到右下的对角线交换后,形成了一个新的矩阵:
1 4 7
2 5 8
3 6 9
明明很快就学会了,然后自己动手做了几个类似的转换。但是,课后老师布置了很多矩阵转换的作业,让同学回家练习,这就使明明很厌烦了,觉得自己已经学会了,就没有再练习的必要了。于是明明就请你帮个忙,帮他写一个程序,来计算矩阵的交换,帮他完成老师布置的作业。
明明的问题可以归结为:有一个r×r的矩阵,把矩阵中的数以左上到右下的对角线的方式进行转换,然后输出转换后的矩阵。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有多行,每组测试数据的第一行有一个整数r(1≤r≤10),表示一个r×r的矩阵,接下来有r行,每行有r个整数,表示要转换的矩阵中的数,每个数用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个转换后的矩阵。每组运算结果形成r行数据,每一行的数字之间以一个空格分隔,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。
个人总结
遍历上三角进行上下三角的交换
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int r;
int tag=1;
while(cin>>r){
int a[10][10];
if(!tag)
cout<<endl;
//输入矩阵
for(int i=0;i<r;i++)
for(int j=0;j<r;j++)
cin>>a[i][j];
//交换
for(int i=0;i<r-1;i++){
for(int j=i+1;j<r;j++){
int t=a[i][j];
a[i][j]=a[j][i];
a[j][i]=t;
}
}
//输出
tag=0;
for(int i=0;i<r;i++){
for(int j=0;j<r;j++){
if(j!=0)
cout<<" ";
cout<<a[i][j];
}
cout<<endl;
}
}
return 0;
}
3.魔方阵
问题描述
在一次数学课上,明明的老师讲了一种非常有趣的方阵,称之为三阶魔方阵。
它是一个三行三列,由1、2、3、......8、9,九个数字共同构成,且它每行、每列、两对角线之和均相等,于是一个合法的三阶魔方阵就形成了以下的方阵:
8 1 6
3 5 7
4 9 2
富有钻研精神的明明回家后,马上就对三阶魔方阵进行研究。
他总结出了5条n阶魔方阵的规律(n为奇数),如下:
(1) 将"1"放在第一行(最上面一行)中间一列;
(2) 从"2"开始直到n*n为止各数依次按下列规则存放:每一个数存放的行的行数比前一个数的行数减1,每一个数存放的列的列数比前一个数的列数加1,即前一个数的右上方。
(3) 如果上一数的行数为1,则下一个数的行数为n(指最下面一行);
(4) 当上一个数的列数为n时,下一个数的列数应为1(指最左一列);
(5) 如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
有了以上的方法,明明就可以轻易地构造出任意的n阶魔方阵。
例如构造3阶魔方阵的过程如下:
先将1放在第一行的中间一列:
放1:(参考规则1)
* 1 *
* * *
* * *
放2:(参考规则3)
* 1 *
* * *
* * 2
放3:(参考规则4)
* 1 *
3 * *
* * 2
放4:(参考规则5)
* 1 *
3 * *
4 * 2
放5:(参考规则2)
* 1 *
3 5 *
4 * 2
放6:(参考规则2)
* 1 6
3 5 *
4 * 2
放7:(参考规则5)
* 1 6
3 5 7
4 * 2
放8:(参考规则4)
8 1 6
3 5 7
4 * 2
放9:(参考规则3)
8 1 6
3 5 7
4 9 2
但是随着n的不断增大,构建一个n阶魔方阵所花的精力就越多。于是明明就请你帮忙,帮助他用程序来构建n阶魔方阵。
明明的问题可以归结为:给你一个阶数n,请你按照题目中描述的方法,构造出n阶魔方阵。
输入说明
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数n(1≤n≤19,且n是奇数),表示要构造的魔方阵阶数。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。输出时,每组运算结果为n阶魔方阵。每组运算结果与其后一组运算结果之间有一个空行,最后一组运算结果后面没有空行。 注:通常,显示屏为标准输出设备。
个人总结
按照规则即可,但要注意要存储上一次元素存放的位置,以便后续调整后当前位置仍有元素的情况能重新回到上一次成功存放元素的位置。
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int tag=1;
while(cin>>n){
//初始化数组
int a[19][19];
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
a[i][j]=0;
int ans=1;
int i=0,j=n/2;//1放的位置
if(!tag)
cout<<endl;
tag=0;
while(ans<=n*n){
a[i][j]=ans++;//放入
int pi=i,pj=j;//存好上一次存放的位置
//调整下一次要放入的位置
if(i==0&&j==n-1)//先处理特殊情况
i=1;
else{
i=(i+n-1)%n;
j=(j+1)%n;
}
if(a[i][j]!=0){//调整后的位置有元素
i=(pi+1)%n,j=pj;
}
}
//输出
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j!=0)
cout<<" ";
cout<<a[i][j];
}
cout<<endl;
}
}
return 0;
}
4.翻译
2.供应链管理
供应链管理是公司使用的流程,用于保证他们的供应链是高效且开销有效(成本可控)。供应链管理能被物联网系统支持。其核心思路是管理由相关企业或合作伙伴组成的整个网络,这些主体参与产品的制造、配送,以及终端客户所需的服务。
在任何时间点,市场力量都可能要求供应链中的供应商、物流服务商、场所、客户及各类专业参与者做出调整。这种可变性会对供应链基础设施产生显著影响:从搭建交易方之间电子通信的基础层,到配置快速生产流程所需的复杂工序与工作流安排,均会受到波及。
- 智能电网与智能建筑
物联网的一项关键应用是推动智能电网的发展。美国各地的多家电力公司已完成或正在推进其电力管理与配电系统的升级:家庭中的各类传感器(如智能温控器)可收集信息,通过网络传输至主站(甚至是本地"枢纽"),主站会运用复杂的电力管理技术,向电网回传控制信号以实现节能。智能电网的实现,依赖于在电力生产、传输、配送与消费环节应用感知、测量与控制设备。
物联网也被应用于住宅、商业、工业及政府场景下的智能建筑建设。智能建筑可以是商场、住宅、医院,也可以是高层写字楼。这类建筑需要对供暖、空调、照明及环境变化进行监测与调控,还能监管建筑安防、消防系统与电梯运行。智能建筑技术的核心是为建筑赋予更精细化的监测与感知"洞察力"。
