用二进制原理 实现遍历算法的实现


算法思想描述

针对类型:对于只有两个分支选择的“树”形结构,
我们可以尝试利用此方式进行每个节点的遍历。
缺点:需要计算的次数较多。

具体方法为:

1.设置一个变量控制次数,若需要遍历n层二叉树,这个数需要 从0 变化到 2n-1次方(选择n-1次)
2.对于该数,利用循环模拟生成它的二进制的每一位


例· 数字三角形/非动态规划方法

【题目来源于网络】

题目描述

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

(图一)

图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。

·输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。

·输出
输出每次测试的最大值并且占一行。

·样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出
30


利用该方法的一个解法(非最优解)
最优解!!!!!!!!!!!!!!!!!!!!!

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#pragma warning(disable : 4996)
int b[50], n;
char a[51];
int main()
{
	
	while (scanf("%d", &n) != EOF)
	{
memset(a, 'y', sizeof(a));
		int rest = n,//剩下的数
			p = 1,//位置
			m = 1;//两个1/2
		while (rest != 0)
		{
			if (m = 2)
			{
				a[p] = 'n';
				b[n - rest] = p;
				rest--;
				m = 1;
			}
			
			if (a[p] == 'y')m++;

			p++;

			if (p > n)
				p = p - n;
		}

		for (int i = 0; i < n - 2; i++)
			printf("%d ", b[i]);
		printf("\n%d %d", b[n - 1], b[n - 2]);
	}
	system("pause");
	return 0;
}

分析

这种方法有些麻烦,但是用来理解这个方法是不错的。

主要的算法是,“判断每次向左还是向右查找”。

利用二进制0/1可以完成此操作。

0表示左,1表示右。

猜你喜欢

转载自blog.csdn.net/weixin_43923674/article/details/85369445