- gf25051 的博客
《咸鱼概要 · C++》方阵填数
- @ 2025-8-14 15:54:07
1.对角线原理
这是一个5*5的方阵

将其按方格的对角线划分

选取一个方格

它的纵坐标与横坐标相减得0

这一行的纵坐标与横坐标相减都得0

这两行纵坐标与横坐标相减都得1

这两行纵坐标与横坐标相减都得2

这两行纵坐标与横坐标相减都得3

这两行纵坐标与横坐标相减都得4

那如果将对角线反个方向呢

这一行的纵坐标与横坐标相加都得6

这一行的纵坐标与横坐标相加都得5,7

这一行的纵坐标与横坐标相加都得4,8

这一行的纵坐标与横坐标相加都得3,9

这一行的纵坐标与横坐标相加都得2,10

总结;
将二维数组用对角线分割,如果是从左上到右下
来分割,则同一行内横坐标与纵坐标相减差相同,
如果是从右上到左下来分割,则同一行内横坐标
与纵坐标相加和相同
图自制,无抄袭
2.真题演练
来看到例题
说明:
输入整数N,输出相应方阵
输入格式:
一个整数N,( 0 < n < 10 )
输出格式:
一个方阵,每个数字的场宽为3
样例
输入数据 1
5
输出数据:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
代码实现:
#include <bits/stdc++.h>//头文件
using namespace std;
int a[105][105],cnt;//定义一个二维数组和变量
int main(){
int n;
cin>>n;//定义n并输入赋值
//遍历二维列表
for(int i=n;i>=1;i--){//控制列数
for(int j=n;j>=1;j--){//控制行数
if(i-j==0){//如果纵坐标-横坐标=0(最中央的对角线)
a[i][j]=1;//便给它赋值为1进行标记
}else{
a[i][j]=0;//否则给它赋值为0进行标记
}
}
}
//再遍历二维列表
for(int i=1;i<=n;i++){//控制列数
for(int j=1;j<=n;j++){//控制行数
cout<<setw(3)<<a[i][j];//输出
}cout<<endl;//换行
}
return 0;
}
再来看一道和它相反的例题
说明
输入整数N,输出相应方阵
输入格式
一个整数N,( 0 < n < 10 )
输出格式
一个方阵,每个数字的场宽为3
样例
输入数据:
5
输出数据:
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
0 1 0 0 0
1 0 0 0 0
代码实现:
#include <bits/stdc++.h>//头文件
using namespace std;
int a[105][105],cnt;//定义一个二维数组和变量
int main(){
int n;
cin>>n;//定义n并输入赋值
//遍历二维列表
for(int i=n;i>=1;i--){//控制列数
for(int j=n;j>=1;j--){//控制行数
if(i+j==n+1){//如果纵坐标+横坐标=n+1(最中央的对角线)
a[i][j]=1;//便给它赋值为1进行标记
}else{
a[i][j]=0;//否则给它赋值为0进行标记
}
}
}
//再遍历二维列表
for(int i=1;i<=n;i++){//控制列数
for(int j=1;j<=n;j++){//控制行数
cout<<setw(3)<<a[i][j];//输出
}cout<<endl;//换行
}
return 0;
}