【算法入门经典】第三章-蛇形填数

本题思路为:先创建一个二维数组,然后找到填数的起始位置,之后用“下-左-上-右”的走法实现一个循环,然后不断重复这个循环就可以实现指定大小的填数了。

那么如何保证填数的时候不会填到已经填完数的位置呢?如果仅仅靠单纯的循环显然无法做到这一点,所以我们需要在循环的条件控制中加入一些“特殊”的限制。那么,这些限制是什么?

这个时候就要引出我认为这个题目想要告诉我们的最核心的思想:先判断,再行动。

这个思想个人认为应当十分重要,并且在今后做题时可能还会多次遇到,而这也是我写本篇博客的理由——帮助记忆这个思想并能在今后的做题过程中加以运用。

好了,这个思想在本题中的体现就是——先判断“下一个”位置是否被填数,如果没有,那么再行动。

#include<stdio.h>
#include<string.h>
#define maxn 20
int arr[maxn][maxn]; //tip:在主函数外定义数组不需要初始化,直接全为0
int main(){
	int x,n,tot= 0;
	int y = maxn;
	scanf("%d",&n);
	memset(arr,0,sizeof(arr));//实现对arr数组的初始化 (属于是多次一举,不过为了和书上格式一样就无所谓了)
	tot = arr[x=0][y=n-1] = 1;
	while(tot<n*n)
	{ 
	//下移动
	while(x+1<n && !arr[x+1][y]) 
		arr[++x][y] = ++tot;//同时实现向下一行与数值+1 
	//左移动 
	while(y-1>=0 && !arr[x][y-1])
		arr[x][--y] = ++tot;
	//上移动 
	while(x-1>=0 && !arr[x-1][y])
		arr[--x][y] = ++tot;
	//右移动 
	while(y+1<n && !arr[x][y+1])
		arr[x][++y] = ++tot;
		}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			printf("%3d",arr[i][j]);
		}
		printf("\n");
	 } 
	 return 0;
		
} 

在做这题的时候出了两个错误:

1.把memset行和tot行搞反了,导致arr[0][n-1]刚赋成1又被归0了(arr[0][n-1]:玩我呢?)

2.++tot写成了tot++,导致输出结果中出现了上下两个1(即arr[0][n-1]与arr[1][n-1]),属于前++与后++的错误,希望大家引以为戒吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值