实现这个目标,可以把数字想像成一条蛇,蛇爬过的数字就加一。把二维数组[y][x]作为地图,y为纵轴,x为横轴。通过改变蛇的坐标让它爬起来(是不是很像贪吃蛇)。!!
#include <iostream>
using namespace std;
//蛇走地图和坐标
int map[100][100] = { {0} };
int x = 0, y = 0;
//蛇走后的留下的数字
int num = 0;
//蛇的前进方向
void right(int);
void down(int);
void left(int);
void up(int);
int main()
{
int size;
cin >> size;
int step;
if (size % 2 == 1)
{
for (step = size - 1; step > 0; step -= 2)
{
right(step);
down(step);
left(step);
up(step);
x++;
y++;
}
int middle = (size - 1) / 2;
map[middle][middle] = ++num;
}
if (size % 2 == 0)
{
for (step = size - 1; step > 0; step -= 2)
{
right(step);
down(step);
left(step);
up(step);
x++;
y++;
}
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}
void right(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y][x++] = num;
}
}
void left(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y][x--] = num;
}
}
void down(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y++][x] = num;
}
}
void up(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y--][x] = num;
}
}
using namespace std;
//蛇走地图和坐标
int map[100][100] = { {0} };
int x = 0, y = 0;
//蛇走后的留下的数字
int num = 0;
//蛇的前进方向
void right(int);
void down(int);
void left(int);
void up(int);
int main()
{
int size;
cin >> size;
int step;
if (size % 2 == 1)
{
for (step = size - 1; step > 0; step -= 2)
{
right(step);
down(step);
left(step);
up(step);
x++;
y++;
}
int middle = (size - 1) / 2;
map[middle][middle] = ++num;
}
if (size % 2 == 0)
{
for (step = size - 1; step > 0; step -= 2)
{
right(step);
down(step);
left(step);
up(step);
x++;
y++;
}
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
return 0;
}
void right(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y][x++] = num;
}
}
void left(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y][x--] = num;
}
}
void down(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y++][x] = num;
}
}
void up(int step)
{
int i;
for (i = 0; i < step; i++)
{
num++;
map[y--][x] = num;
}
}
这些都挺简单的对吧,关键是怎么让蛇在我们希望时调头。在这我想先说说我发现的一些规律:
(9^2-1)/4=20=2+4+6+8; 10^2/4=25=1+3+...+9;
(11^2-1)/4=120=2+4+...+10; 12^2/4=36=1+3+...+11;
对于奇数(a^2-1)/4=2+4+...+(a-1); 对于偶数(b^2)/4=1+3+...+(b-1);
也许你会说这有什么用,别急,好戏还在后头。
我们要围成n*n的正方形矩阵,正方形有4条边,正好对应上面的除以4,所以,你懂我意思把。
以10*10为例,第一层每边走9步,第二层7步,第三层5步,第四层3步,第五层1步,这样就刚好把整个地图走完。
这是不是和10^2/4=25=1+3+...+9很像。
对应如图: