蓝桥杯-C语言练习题(八)----蛇形填数

一、题目要求如下

二、解题思路

蛇形走位就是

而每次移动都要将步数+1,刚开始是1,第二个点是2,第三个点是3....第n个点是n;

将位置行数称为行坐标[ i ],列数称为列坐标[ j ]; 分解一下,可以得到大概四种情况:

        1、当 行坐标【i】为0时(i=0),向右移动(列坐标【j+1】)

        2、当 列坐标【j】为0时(j=0),向下移动(行坐标【i+1】)

        3、当行列坐标不为0上一步是右移时,向左下移动直至情况2

        4、当行列坐标不为0上一步是下移时,向右上移动直至情况1

如图所示

 所以这里用到一个思想,用while循环来作为3和4的操作步骤;终止条件就是当行或列为0;

然后在最外层再套一个while(1),即无限循环。

while(1){

        while(j>0){******* }

        while(i>0){ *******}

}

但是情况1和情况2还没有操作。

其实可以在执行完3或者执行完4后单独加一步操作:

当执行完右上的运动后,就执行一次右移

当执行完左下的运动后,就执行一次下移

又因为第一次是右移,即:

while(1){

        右移;

        while(j>0){ 向左下移动 }

        下移;

        while(i>0){ 向右上移动 }

}


但是怎么跳出最外面的无限循环呢?

可以每次执行完一种情况以后都做一次if判断,判断当前i和j是否是我们要求的19(第20个就是下标19)

因为20行20列一定是中间元素( i 和 j 均大于0)

所以当i和j等于20时,循环一定是处在情况3和情况4,也就是第二层while中,所以if判断一定要在第二层while中 和 执行完当前while后的下一条语句,即:

while(1){

        右移;

        while(j>0){ 向左下移动 ;if判断跳出循环;}

        if判断跳出循环;

        下移;

        while(i>0){ 向右上移动 ;if判断跳出循环;}

        if判断跳出循环;

}

三、代码实现

#include <stdio.h>

int main()
{
  // 请在此输入您的代码
  int a[100][100],i=0,j=0,num=1;
  a[0][0]=1;

  while(1){     //只有找到20行20列的元素才跳出循环
    //向右移动
	  j+=1;
	  num+=1;
	  a[i][j]=num;
    //向左下移动,当j接触到0后(撞到左墙壁后)跳出循环
	  while(j>0) {j-=1;i+=1;num+=1;a[i][j]=num;if(i==19 && j==19) break;}
	  if(i==19 && j==19) break;//是否是20列20行的元素
    //向下移动
	  i+=1;
	  num+=1;
	  a[i][j]=num; 
    //向右上移动,当i接触到0后(撞到上墙壁后)跳出循环
    while(i>0) {i-=1;j+=1;num+=1;a[i][j]=num;if(i==19 && j==19) break;}
    if(i==19 && j==19) break;//是否是20列20行的元素
  }
  printf("%d",a[i][j]);
  return 0;
}

-----------------------------------------------------------------------------------

码题不易,跪求点赞!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值