回型矩阵【***】 - 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;
}