题目
输入一个 𝑛 行 𝑚 列的矩阵,从左上角开始将其按回字形的顺序顺时针打印出来。
参数
| 变量 / 数组 | 作用 |
|---|---|
| arr[50][50] | 存储输入的矩阵(最多支持 50×50 的矩阵) |
| st[50][50] | 标记矩阵中的位置是否已经被打印过(true= 已打印,false= 未打印) |
| dx[4] / dy[4] | 方向数组:控制移动的 “上下左右” |
| d | 当前移动方向(0 = 上,1 = 右,2 = 下,3 = 左) |
| x / y | 当前所在的矩阵坐标(x = 行号,y = 列号) |
方向数组
// dx控制行的变化,dy控制列的变化intdx[4]={-1,0,1,0};// 上(行-1)、右(行不变)、下(行+1)、左(行不变)intdy[4]={0,1,0,-1};// 上(列不变)、右(列+1)、下(列不变)、左(列-1)代码
#include<iostream>#include<algorithm>usingnamespacestd;intmain(){intn,m;intarr[50][50];// 存储矩阵// 1. 输入矩阵的行数n、列数m,再输入矩阵元素cin>>n>>m;for(inti=0;i<n;i++)for(intj=0;j<m;j++)cin>>arr[i][j];// 2. 初始化标记数组(所有位置默认未打印)boolst[50][50]={false};// 3. 方向数组:上、右、下、左intdx[4]={-1,0,1,0},dy[4]={0,1,0,-1};// 4. 初始状态:方向d=1(右),起始位置(0,0)(矩阵左上角)intd=1,x=0,y=0;// 5. 核心循环:要打印n*m个元素(矩阵总元素数)for(inti=0;i<n*m;i++){// 5.1 计算下一个要移动的位置(a,b)inta=x+dx[d],b=y+dy[d];// 5.2 判断下一个位置是否“越界”或“已打印”:是则换方向if(a<0||a>=n||b<0||b>=m||st[a][b]){d=(d+1)%4;// 换方向(右→下→左→上→右...循环)a=x+dx[d],b=y+dy[d];// 换方向后重新计算下一个位置}// 5.3 打印当前位置的元素,标记为已打印cout<<arr[x][y]<<' ';st[x][y]=true;// 5.4 移动到下一个位置x=a,y=b;}cout<<endl;return0;}