题目描述:
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入描述:
直接输入方陈的维数,即n的值。(n<=100)
输出描述:
输出结果是蛇形方陈。
样例输入:
复制
3
样例输出:
7 8 1
6 9 2
5 4 3
想法:
想法1:
肯定是要有个计步器(1到n*n),关键是怎么控制边界
想法2:
肯定是要有个计步器(1到n*n),只不过不用控制边界,只用检测数组是否已经走过,已经走过则改变方向,按照下左上右的顺序一直走n*n步
代码实现:
想法1:
/*
用step控制步数一直到n*n
整个阶段分为向下一次,向左向上,向右向下。
向左向上一次,右边界下边界减去1
向右向下一次,上边界左边界加上1
保存到数组,最后通过数组输出
这个方法,数组下标从1开始存储(1到n)
*/
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n; //n*n的方阵
int store[101][101] = { 0 };
int step = 0; //用来计数1到n*n
int i = 1, j = n, k = 1, side = n, direction = 0;
//i是行,j是列 ,k用来记录向上,向左i,j的最小边界,边长,side用来记录向下向右i,j的最大边界
//先向下走一段,之后分为向左向上,向右向下两种情况
for (; i <= side; i++)
{
store[i][j] = ++step;
}
i--;
j--;
while (step < n*n)
{
switch (((++direction) % 4 + 1)) //顺序:下,左,上,右;switch还是有必要的,因为不知道最后一圈可能凑不够4下
{ //左,上,边长一样;右,下,边长一样
case 1: //向下的情况
for (; i <= side; i++) //最后一下会成为side+1,越界了
{
store[i][j] = ++step;
}
i--;
j--;
//side--; //只有向上的时候边长才会减少
break;
case 2: //向左的情况
for (; j >= k; j--)
{
store[i][j] = ++step;
}
j++;
i--;
break;
case 3: //向上的情况
for (; i >= k; i--)
{
store[i][j] = ++step;
}
k++;
i++;
j++;
side--;
break;
case 4: //向右的情况
for (; j <= side; j++)
{
store[i][j] = ++step;
}
j--;
i++;
break;
}
}
for (int x = 1; x <= n; x++)
{
for (int y = 1; y <= n; y++)
{
cout << store[x][y] << " ";
}
cout << endl;
}
return 0;
}
想法2:
/*
肯定是要有个计步器(1到n*n),只不过不用控制边界,
只用检测数组是否已经走过,已经走过则改变方向,按照下左上右的顺序一直走n*n步
这个方法,数组下标从0开始存储(0到n-1)
*/
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n; //n*n的方阵
int store[101][101] = { 0 };
int step = 0; //用来计数1到n*n
int i = 0, j = n - 1;
store[i][j] = step = 1; //右上角赋值,因为右上角那个起始点1,在下面的循环的开始无法处理
while (step < n*n) //顺序:下左上右
{
while (i + 1 < n && !store[i + 1][j])
store[++i][j] = ++step;
while (j - 1 >= 0 && !store[i][j - 1])
store[i][--j] = ++step;
while (i - 1 >= 0 && !store[i - 1][j])
store[--i][j] = ++step;
while (j + 1 < n && !store[i][j + 1])
store[i][++j] = ++step;
}
for (int x = 0; x < n; x++)
{
for (int y = 0; y < n; y++)
{
cout << store[x][y] << " ";
}
cout << endl;
}
return 0;
}