21 22 ................
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
的矩阵。
有两个问题:
1.编程输出这个矩阵。
2.设点1的坐标为(0,0),X方向向右为正,Y方向向下为正。比如7的坐标是(-1,-1),2是(0,1),3是(65438)。
1.第一个问题是通过模拟构建的。可以看出,从1开始的方向变化总是对的->;向下-& gt;左-& gt;向上,
连续行走长度为1->;1->;2->;2->;3->;3->;...,发现这个规律后写代码就不难了!注意我在下面设置了1的位置。
在((n-1)/2,(n-1)/2)的位置。
空模拟(整数)
{
int x,y;
x = y =(n-1)/2;//1的位置
data[x][y]= 1;
int len = 1;
int count = 0;
int num = 2;
方向dir =右;
while(num & lt;= n * n)
{
for(int I = 0;我& ltleni++)
{
开关(方向)
{
案例左侧:
-y;打破;
案例权利:
++ y;打破;
案例向上:
-x;打破;
案例向下:
++ x;打破;
默认:break
}
data[x][y]= num++;
}
count++;
if(count == 2)
{
count = 0;
len++;
}
dir =(方向)((dir+1)% 4);
}
}
2.对于第二个问题,我也是先找出规律,再模拟。
首先不难看出,n*n的螺旋矩阵的右下角坐标一定是(m,m),其中m=n-1。
通过观察可以看出,当n=1时,右下角(0,0)的值是1,当n=2时,右下角(1,1)的坐标值是(3,3),当n=3时,右下角(2,3)。
a,b,c可以通过联立方程得到。最后f(n)= 4 * n ^ 2-2 * n+1。
接下来根据(x,y)和右下角(n-1,n-1)的关系计算值。这里需要注意的是,当X的值与n-1相同时,应优先考虑Y是否与-m相关。这就要求我们要注意函数中x和y的判断顺序。
代码如下:
//以(1,1)的位置为原点,向右为X正半轴,向下为Y正半轴。
int GetValue(int x,int y)
{
int m = max(abs(x),ABS(y));
int right bottom = m * m * 4-2 * m+1;
int value = 0;
如果(x == -m)
{
value = right bottom+2 * m+m-y;
}
else if( y == m)
{
value = right bottom+m-x;
}
else if(y == -m)
{
值= right bottom+4 * m+x+m;
}
else if( x == m)
{
value = right bottom-(m-y);
}
返回值;
}