T75:魔方阵------二维数组

代码实现:
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
int n;
bool first=true;
while(cin>>n){
if(!first){
cout<<endl;
}
first=false;
//创建n阶魔方阵
int magic[19][19]={0};
//规则1:将"1"放在第一行中间
int row=0;//行
int col=n/2;//列
//放数
magic[row][col]=1;
//规则2:从2开始填充到n*n
//先按规则2尝试移动到右上角(row-1,col+1)然后看是否越界,再按规则3和4调整
for(int num=2;num<=n*n;num++){
int nextrow=row-1;//下一行
int nextcol=col+1;//下一列
//规则3:如果向上移动超过顶部,则回到底部
if(nextrow<0){
nextrow=n-1;//最后一行,索引为n-1
}
//规则4:如果向右移动超过右侧,则回到左侧
if(nextcol>=n){
nextcol=0;//第一列,索引为0
}
//规则5:如果目标位置已有数,或者上一个数是第一行第n列
if(magic[nextrow][nextcol]!=0||(row==0&&col==n-1)){
//放在上一个数的下面
nextrow=row+1;
nextcol=col;
}
//放数
row=nextrow;
col=nextcol;
magic[row][col]=num;
}
//输出魔方阵
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j>0) cout<<" ";
cout<<magic[i][j];
}
cout<<endl;//输出一行之后换行
}
}
return 0;
}


个人思考:
这道题稍微有些复杂,主要是怎么理解这几个规则的关系,首先需要将1放在第一行的中间列,然后按照尝试将下一个数放在放在当前数的右上方,接着判断是否会越界,根据规则3和4进行调整,如果计算出的位置被展通,或者上一个数位于第一行最后一列则按照规则5。然后将当前数字放在确定的位置并更新row和col为新的位置。
T76:最大效益------二维数组

代码实现:
//next_permutation 是一个强大的工具,适用于需要枚举所有排列的问题。在最大效益问题中,它完美地枚举了所有可能的职员-客户匹配方案,使得代码简洁高效。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int a[5][5];
while(true){
//读取5*5的效益表
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(!(cin>>a[i][j])){
return 0;
}
}
}
int maxsum =0;
int s[5]={0,1,2,3,4};//客户编号的排列
//枚举所有排列,计算最大效益
do{
int sum=0;
for(int i=0;i<5;i++){
sum+=a[i][s[i]];//第i名职员匹配第s[i]个客户
}
if(sum>maxsum){
maxsum=sum;
}
}while(next_permutation(s,s+5));
cout<<maxsum<<endl;
}
return 0;
}

个人思考:
这道题利用了一个next_permutation函数可以生成所有可能的排列,这一点可以让整个程序变得很简洁,先通过二维数组把数据读入,然后枚举所有排列,为5名职员各分配一个不同的客户,五个数一共120种排列,遍历每种排列下效益的值,如果大于已经记录的值就更新。
T77:螺旋方阵------二维数组

代码实现:
#include <iostream>
using namespace std;
void function(int n){
int arr[11][11]={0};//n最大为10,所以用开11*11的数组
//定义边界和起始值
int top=0,bottom=n-1,left=0,right=n-1;
int num=1;
while(top<=bottom&&left<=right){
//从左到右填充顶部行
for(int i=left;i<=right;i++){
arr[top][i]=num++;
}
top++;
//从上到下填充右侧列
for(int i=top;i<=bottom;i++){
arr[i][right]=num++;
}
right--;
//先检查是否还有行需要填充
if(top<=bottom){
//从右到左填充底部行
for(int i=right;i>=left;i--){
arr[bottom][i]=num++;
}
bottom--;
}
//先检查是否还有列需要填充
if(left<=right){
//从下到上填充左侧列
for(int i=bottom;i>=top;i--){
arr[i][left]=num++;
}
left++;
}
}
//输出螺旋方阵
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j>0) cout<<" ";
cout<<arr[i][j];
}
cout<<endl;
}
}
int main(){
int n;
bool first=true;
while(cin>>n){
if(!first){
cout<<endl;
}
first=false;
function(n);
}
return 0;
}

个人思考:
这道题需要搞清题目的意思,然后考虑好边界情况,从左到右和从上到下都是正常的更新就可以,从右到左和从下到上需要考虑是否还有行和列,然后构造完成之后就可以正常的输出了。
英语翻译:
P51:3.智能电网与智能建筑
物联网的一个关键应用是推动智能电网的发展。美国各地的多家电力公司已经或正在升级其电力管理与配电系统。家庭中的各类传感器(如智能恒温器)可以收集信息,并通过网络发送至主站(甚至可能是本地"集线器"),这些主站能够实施复杂的电力管理,并向电网发送控制信号以节约能源。智能电网的实现,依赖于在电力生产、传输、配电和消费环节应用传感、测量与控制设备。
grid:电网;网格
thermostats:恒温器;温控器
station:站;站点
sense:传感;感知
measurement:测量;计量
distribution:配电;分配
consumption:消费;消耗
P52:物联网技术已被应用于住宅、商业、工业及政府场景下的智能建筑建设。一座智能建筑可以是购物中心、住宅、医院或高层办公楼。智能建筑需要对供暖、空调、照明及环境变化进行监测与调控,同时也能管控建筑安保、消防灭火及电梯运行等系统。智能建筑技术的核心,是为建筑带来更精细的监测与传感"感知能力"。
be suggested in:被应用于;被提议用于
residential:住宅的;居住的
high-rise office tower:高层办公楼
monitor:监测;监控
regulation:调控;调节
oversee:管控;监督
suppression:抑制;灭火
P53:那么,我们再回到现代计算机的切换能力上来:20世纪70年代的计算机通常一次能够处理8个开关。也就是说,在每个周期内,它们可以处理8个二进制数字,也就是8个比特。由8个比特组成的一组数据被称为一个字节,每个字节包含256种可能的"开/关"组合(即1或0的组合)。每种组合都等价于一条指令、指令的一部分,或是某种特定类型的数据,例如一个数字、一个字符或一个图形符号。例如,模式11010010可能是二进制数据------在本例中,它代表十进制210;也可能是一条指令,告知计算机将存储在其内部开关(寄存器)中的数据,与存储在某个存储芯片位置的数据进行比较。
binary digits:二进制数字
bits:比特
equivalent:等价物;等同于
datum:数据(单数)
graphics:图形;图像
decimal:十进制的;十进制数
switches:开关;寄存器
memory-chip:存储芯片
背单词:
