有关蛇形填数的问题

最常见的蛇形填数问题是:在n*n方阵里填入1,2,3,......,n*n,要求填成蛇形。


下面我就直接上代码了,代码都是可以直接在编译器上运行的。

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#define len 1000+5
int vec[len][len] = { 0 };

int main()
{
int x, y, k,n=0,r=0;
scanf("%d", &k);

r = vec[x = 0][y = 0] = 1;
    while (n < (k + 1) / 2)//当然我们在这儿也可以变换一下:r{
while (y + 1 < k && !vec[x][y + 1]) { vec[x][++y] = ++r; }
while (x + 1 < k && !vec[x + 1][y]) { vec[++x][y] = ++r; }
while (y - 1 >= 0 && !vec[x][y - 1]){ vec[x][--y] = ++r; }
while (x - 1 >= 0 && !vec[x - 1][y]) { vec[--x][y] = ++r; }
n++;
}

for (int i = 0; i < k; i++)
{
for (int j = 0; j < k; j++)
{
printf("%3d", vec[i][j]);
}
printf("\n");
}


system("pause");
}


这种问题的变种:

问题描述如下:

时间限制:1000 ms  |  内存限制:65535 KB

【问题描述】

peter喜欢玩字母游戏,于是他编写了一个有趣的游戏。游戏规则是在一个 (N-1) * N的表格里填写字母,规则:对于每个输入的N,由 (N-1) * N的字母区域的左上角开始,从字母A开始逆时针填充一个字母区域,乘积若超过26继续由新一组的A、B、C„„填充,不要求输出边框。

【输入】

多组测试数据(数据量在100组以内)。每组测试数据只有一行为一个整数N(1<=N<=30),表示表格的宽度。

【输出】

对于每组输入数据,输出N-1行,为填完的表格(N-1行,每行N个整数,每个数字之间用空格隔开)。

【样例输入】

5

【样例输出】

代表一个4*5的顺时针旋转的字母区域,其样式如下:  

A B C D E

N O P Q F 

M T S R G 

L K J I H


代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#define len 1000+5
char vec[len][len] = { 0 };


int main()
{
int x, y, k, n=0;
char v;


scanf("%d", &k);
v = vec[x=0][y=0] = 'A';


while (n < (k + 1) / 2)
{
while (y + 1 < k && !vec[x][y + 1])
{
if (vec[x][y] == 'Z')
{
v = 'A';
vec[x][++y] =v;
}
else
{
vec[x][++y] = ++v;
}
}


while (x + 1 < k-1 && !vec[x + 1][y])
{
if (vec[x][y] == 'Z')
{
v = 'A';
vec[++x][y] = v;
}
else
{
vec[++x][y] = ++v;
}


}


while (y - 1 >= 0 && !vec[x][y - 1])
{
if (vec[x][y] == 'Z')
{
v = 'A';
vec[x][--y] = v;
}
else
{
vec[x][--y] = ++v;
}
}


while (x - 1 >= 1 && !vec[x - 1][y])
{
if (vec[x][y] == 'Z')
{
v = 'A';
vec[--x][y] = v;
}
else
{
vec[--x][y] = ++v;
}
}


n++;
}


for (int i = 0; i < k-1; i++)
{
for (int j = 0; j < k; j++)
{
printf("%3c ", vec[i][j]);
}
printf("\n");
}


system("pause");
}


以上代码都是在vs2013上测试发布的

你可能感兴趣的:(程序设计入门,蛇形填数)