一、题目要求如下
二、解题思路
蛇形走位就是
而每次移动都要将步数+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;
}