题解 | #回型矩阵#
回型矩阵
https://www.nowcoder.com/practice/36d5dfddc22c4f5b88a5b2a9de7db343
#include <iostream>
using namespace std;
int main() {
int a;
while (cin >> a) { // 注意 while 处理多个 case
int m[21][21]={0};
int b=1,i=0,j=0;
int direction[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
int directionindex = 0;
// 0 右 1 下 2 左 3上
while(b<=a*a)
{
m[i][j]=b++;
// 开始放下一个位置了
int i_next = i + direction[directionindex][0];
int j_next = j + direction[directionindex][1];
// directionindex 代表上下左右
if(i_next<0 || i_next>=a || j_next>=a || j_next<0 || m[i_next][j_next]!=0)
{
directionindex = (directionindex+1)%4;
i_next = i + direction[directionindex][0];
j_next = j + direction[directionindex][1];
}
i = i_next;
j = j_next;
}
for(int i=0;i<a;i++)
{
for(int j=0;j<a;j++)
{
cout<<m[i][j]<<" ";
}
cout<<endl;
}
}
}
// 64 位输出请用 printf("%lld")
像这种题目 最合适的方法还是一个数字一个数字的放 再去判断放的位置 是否是合法的
