#include<stdio.h>
#define uint16 unsigned int
const int dx[4] = { 0,1,0,-1 };//这里是代表了四个方向,分别是右,下,左,上(或者说东,南,西,北)
const int dy[4] = { 1,0,-1,0 };//这里是顺时针旋转,如果不是顺时针,可以根据题目转换
void screw_init(int n,int q);//构造n行m列的螺旋矩阵
void print_num(int n);
void init(int n, int m);
uint16 f[50][50];
void main()
{
screw_init(5,3);
print_num(5);
}
void print_num(int n)
{
for (int i = 1; i < n+1; i++)
{
for (int j = 1; j < n+1; j++)
{
printf("%d ", f[i][j]);
}
printf("\n");
}
}
void init(int n, int m)//构造n行m列的螺旋矩阵
{
int x = 1, y = 1, d = 0;//从初始坐标(1,1)开始,d表示初始方向为右(东)
for (int i = 1; i <= n * m; i++)
{
if ((x + dx[d] > n || y + dy[d] > m || y + dy[d] <= 0) || (f[x + dx[d]][y + dy[d]]))//判断行走的下一个状态是否碰壁
{//( 下移时是否碰越下界 || 右移时是否越右界 || 左移时是否越左界) || (若不改变移动方向 下一点是否已经到达过)
d = (d + 1) % 4;//碰壁后换移动方向
}
f[x][y] = i;//标记当前到达点 (赋值即标记)
x += dx[d];
y += dy[d];//以当前方向(可能改变也可能未改变)移动一次
}
}
void screw_init(int n,int q)
{
int x = 1, y = 1, d = 0;
for (int i = q; i <= n * n + q; i++)
{
if ((x + dx[d] > n || y + dy[d] > n || y + dy[d] <= 0) || (f[x + dx[d]][y + dy[d]]))
{
d = (d + 1) % 4;
}
f[x][y] = i;
x += dx[d];
y += dy[d];
}
}