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;
}