数据结构课之经典蛇形填数

蛇形填数1

        在n*n方阵里填入1,2,3,…,n*n,要求填成蛇形。

        例如n=4时方阵为:

    

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
int a[105][105];
int main(){
	int n;
	cin>>n;
	int i=-1,j=n-1,num=0;
	while(num<n*n)
	{
		while(i<n-1&&!a[i+1][j])//下方
		 	a[++i][j]=++num;
		while(j>0&&!a[i][j-1])//左方
			a[i][--j]=++num;
		while(i>0&&!a[i-1][j])//上方
			a[--i][j]=++num;
		while(j<n-1&&!a[i][j+1])//右方
			a[i][++j]=++num;
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			printf("%3d ",a[i][j]);
		printf("\n");
	}
	return 0;
}	

蛇形填数2

        描述

        1  2  3  4  5

        12 13 14 6

        11 15 7

        10 8

        9

        跟蛇形填数一样,只是填数要求按照三角形填。注意每组数据之间用空行隔开

      输入

        第一行有一个N,表示N组测试数据

        接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000

      输出

        输出之后填好之后的图

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int M=1e3+10;
int a[M][M];
int main(){
	int N,x;
	scanf("%d",&N);
	while(N--)
	{
		memset(a,0,sizeof(a));
		scanf("%d",&x);
		int i=0,j=-1,cnt=(1+x)*x/2,num=0;
		while(num<cnt)
		{
			while(j<x-1&&!a[i][j+1])//右方 
				a[i][++j]=++num;
			while(i<x-1&&j>0&&!a[i+1][j-1])//左下方 
				a[++i][--j]=++num;
			while(i>0&&!a[i-1][j])//上方
				a[--i][j]=++num; 
		}
		for(int i=0;i<x;i++)
		{
			for(int j=0;j<x-i;j++)
			{
				printf("%3d ",a[i][j]);
			}
			printf("\n");
		}	
	}
	return 0;
}

蛇形填数3

     输入

        第一行有一个N,表示方阵的大小

        i,j分别表示第i行,第j列

      输出

       (1)输入N,则输出填好之后的图

       (2)输入i,j,则输出图形中相应位置的数值

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int M=1e3+10;
int a[M][M];
int Sum(int n)
{
	return (1+n)*n/2;
}
int main(){
	int N;
	while(~scanf("%d",&N))
	{
		for(int i=1;i<=N;i++)
		{
			for(int j=1;j<=N;j++)
			{
				int num=(i-1)*i/2+1;
				int bj=N-i+1;
				if(j>=bj)num+=Sum(N)-Sum(i);
				else num+=Sum(j+i-1)-Sum(i);
				if(j>bj)
				{
					int bj2=j-bj;
					num+=Sum(N)-Sum(N-bj2);
				}
				a[i][j]=num;
				printf("%2d ",num);
			}
			printf("\n");
		}
		int i,j;
		scanf("%d%d",&i,&j);
		printf("%d\n",a[i][j]);
	}
	return 0;
}	
	

        蛇形填数3参考了博主m0_51990674的博客_skywalker767_CSDN博客的解题方法与视频讲解,QQ小程序

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值