蛇形填空 I

蛇形填空是等考常考题型,通常是从某点出发,由内至外、或由外之内,或顺时针,或逆时针,依次填充。我们来看由外至内这个示例:

示例:

描述:在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)

输出:输出结果是蛇形方阵。

 分析:

(1)方向设置

蛇形填空需要向下走、向左走、向上走和向右走四个方向。设某点坐标 (x,y),若:

向下走,其坐标为:(x+1,y)

向左走,其坐标为:(x,y-1)

向上走,其坐标为:(x-1,y)

向右走,其坐标为:(x,y+1)

(2)边界判断

方阵左上角的坐标为(0,0),右下角的坐标为(n-1,n-1),故此,

向下走:x+1 < n

向左走:y-1 >= 0

向上走:x-1 >= 0

向右走:y+1 < n

(3)标记填充状态

无论沿哪个方向进行填充,一个是要判断是否越界,另一个就是要判断是否填充过,如果填充过了,就不再填充了。方法就是初始化二维数组为0,0表示未填充,不是0表示已填充过。

C语言代码如下:

#include <stdio.h>
#define N 100
int main()
{
	int x,y,n,a[N][N]={0},tot;
	scanf("%d",&n);
	x=0;
	y=n-1;
	a[x][y]=1;
	tot=1;
	
	while(tot<n*n)
    {
    	while(x+1<n && a[x+1][y]==0)	//向下走
        {
        	x++;
			tot++;
			a[x][y]=tot;
		}
		
		while(y-1>=0 && a[x][y-1]==0)	//向左走
        {
        	y--;
        	tot++;
			a[x][y]=tot;
		}
		
		while(x-1>=0 && a[x-1][y]==0)	//向上走
        {
        	x--;
			tot++;
			a[x][y]=tot;
		}
		
		while(y+1<n && a[x][y+1]==0)	//向右走
		{
			y++;
			tot++;
			a[x][y]=tot;
		}
	}
	
	for(x=0;x<n;x++)
	{
		for(y=0;y<n;y++)
			printf("%d ",a[x][y]);
		printf("\n");
	}
	return 0;
}

python语言代码如下:

n = int(input())
# 初始化二维数组,这里用list实现,也可以用numpy下的array实现
lst = []
for i in range(n):
    l1 = [0] * n
    lst.append(l1)

x = 0
y = n - 1
tot = lst[x][y] = 1

while tot < n * n:
    while x+1 < n and lst[x+1][y] == 0:     # 向下走
        x = x + 1
        tot = tot + 1
        lst[x][y] = tot

    while y-1 >= 0 and lst[x][y-1] == 0:    # 向左走
        y = y - 1
        tot = tot + 1
        lst[x][y] = tot

    while x-1 >= 0 and lst[x-1][y] == 0:    # 向上走
        x = x - 1
        tot = tot + 1
        lst[x][y] = tot

    while y+1 < n and lst[x][y+1] == 0:     # 向右走
        y = y + 1
        tot = tot + 1
        lst[x][y] = tot

for i in range(n):
    for j in range(n):
        print(lst[i][j], end=' ')
    print()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值