C语言使用技巧(二十二):算法技巧:while(1)与if循环的循环扣圈搜索与路径节点搜索

不要小看这个技巧,当你使用它的时候就知道它的威力:如数据点搜索、点云ID搜索、最短路径经过的节点搜索等都会用到。

先来看看语法:
在这里插入图片描述
如果表达式为真就继续执行,如果内部没有条件终止执行结果,则会一直执行下去:

#include<stdio.h>

int main(void) 
{
	int i = 1;
	
	while(1)
	{
		if(i--)
		{
			printf("%d ", i);	
		} 
	}
	return 0;
}

执行结果:
在这里插入图片描述
如果给出条件,则跳出循环

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int i;

    while (1)
    {
        printf("%d ", i);
        if (i == 10)
        {
            break;
        }
        i = i +1;
    }
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述
如果将上面的算法应用在数组中,可以看到

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i = 1;

    int arr[3] = {2,2,3};
    while (1)
    {
        printf("end_point=%d\t", i);
        //如果等于3就输出,否则继续执行下一步循环,一直将这里的i下一步赋值给arr[i]
        //这里的3其实就是寻找数组中的元素3 
        if (i == 3) 
            break;
        i = arr[i];
    }
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述
我们可以换一换更长的数组来搜索从某一点走到另一点的方法:我们这里可以先来看看不能走通的数据元素

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i = 1;
    int arr[10] = {1, 4, 7, 3, 9, 0, 3, 5, 8, 2};
    // int arr[3] = {2,2,3};
    while (1)
    {
        printf("end_point=%d\t", i);
        if (i == 3) 
            break;
        i = arr[i];
    }
    system("pause");
    return 0;
}

执行结果:
在这里插入图片描述
可以发现,这个是死循环,而且是扣圈,为什么是扣圈循环呢,因为循环每一行都是:

end_point=4     end_point=9     end_point=2     end_point=7     end_point=5     end_point=0     end_point=1

这里循环的右边是0,然后数组的arr[0]正好是1,此时还是不能满足i==3的条件,因此无法找到跳出的路径,只能继续循环。

如果替换一个条件

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i = 1;
    int arr[10] = {1, 4, 7, 3, 9, 0, 3, 5, 8, 2};
    // int arr[3] = {2,2,3};
    while (1)
    {
        printf("end_point=%d\t", i);
        if (i == 9) 
            break;
        i = arr[i];
    }
    system("pause");
    return 0;
}

执行结果:并且也打印了途中经过的点
在这里插入图片描述
以上方法给路径算法、选择起点到终点等方面的技巧有很大的帮助。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源代码杀手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值