Please enable java script to visit.
NOTEBOOK
HOMEPHP / MySQLJS / HTMLWXappPythonC++Blender其他
回型矩阵【***】 - NOTEBOOK
回型矩阵【***】
C++
Posted on 2023-08-10
摘要 : 接触稍微复杂的逻辑关系。
❱ 描述:

给你一个整数n,按要求输出n∗n的回型矩阵

❱ 输入描述:

输入一行,包含一个整数n
1<=n<=19

❱ 输出描述:

输出n行,每行包含n个正整数.

❱ 用例输入:

4



❱ 用例输出:

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7


#include<iostream>
using namespace std;

int main() {
int m; // 定义 行,列
cin>>m;
int a[m+2][m+2]={0}; // 二维数组初始化

int d = 1; // 方向,分别为 1,2,3,4
int x= 1,y = 0; // 初始坐标,第一行,但还未出发,所以y设置为0
int target_step = m; // 每一行要走的步数,第一行要走m,所以设置为m
int thisstep = 0; // 当前行走了多少步,计数器。


for (int i=1;i<=m*m;i++){ // 总共多少格?总数 m*m

if(d == 1){ // 向右走, y每次递增1
y++;
}else if(d == 2){ // 向下走, x每次递增1
x++;
}else if(d == 3){ // 向左走, y每次递减1
y--;
}else if(d == 4){ // 向上走, x每次递减1
x--;
}


a[x][y] = i; // 移动一格后,赋予变量 i
// cout <<x<<" "<<y<<" "<<i<<endl;

thisstep ++; // 计数,当前行走了几步
if(thisstep >= target_step){ // 如果当前行已经走的步数,达到当前行的目标步数,则转弯。
thisstep = 0; // 计数器归零。

d++; // 转弯
// cout<<"转"<<d<<endl;
if(d>4){ // 如果达到5,则转为1
d=1;
}
if(d==2 || d==4){ // 如果是第二或第四方向,目标步数减少1。
target_step --;
}
}
}

// 打印矩阵
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
cout << a[i][j]<<" "; // 依次打印每一行,用空格隔开。
}
cout<<endl; // 每一行结束,打印换行符号。
}
}



❱ 另一种方法

#include <iostream>
using namespace std;
int n, a[23][23];
int main() {
cin >> n;

a[1][1] = 1;

int i = 1, j = 1; // 当前位置

for(int k = 1; k <= 10; k++) { // 走10圈肯定走完了
while(j + 1 <= n && !a[i][j + 1]) { // 能往右走就往右
a[i][j + 1] = a[i][j] + 1;
j++;
}
while(i + 1 <= n && !a[i + 1][j]) { // 往下走
a[i + 1][j] = a[i][j] + 1;
i++;
}
while(j - 1 >= 1 && !a[i][j - 1]) { // 往左走
a[i][j - 1] = a[i][j] + 1;
j--;
}
while(i - 1 >= 1 && !a[i - 1][j]) { // 往上走
a[i - 1][j] = a[i][j] + 1;
i--;
}
}

for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cout << a[i][j] << ' ';
}
cout << endl;
}

return 0;
}