每日学习-1月29日

知识点:深度优先搜索

 深度优先搜索是将当前状态按照事先2约定的产生式规则顺序,先使用一个产生式规则拓展一步得到一个新状态,然后再对这个状态递归拓展下去。如果无法拓展,则退回一步回到上一个状态,再按照原先设定的产生式规则顺序应用另外的产生式规则重新寻找一个新状态进行拓展。如此搜索,直到找到目标状态或遍历完所有状态。

深度优先搜索过程中的状态“退回一步”的操作,符合栈的“后进先出”的特点,所以深度优先搜索一般采用栈来实施算法过程。

算法思路:

每日学习-1月29日_第1张图片

假设1为起始点,先将1入栈,栈顶指针指向1,设定搜索与此时的数相邻且较小的数,此时与1相邻的数有2和8,,且2<8,故将2入栈,栈顶指针指向2,以此类推,当将5入栈后,发现没有符合的目标,故回溯,将5出栈,栈顶指针回到4,之后将6入栈,7入栈时同理。

每日学习-1月29日_第2张图片

最后当8入栈后发现,此时已经没有与8相邻且未被遍历的结点,故弹出,栈顶指针指向6,接下来与8弹出同理,将6,4,3,2,1逐一弹出。 

每日学习-1月29日_第3张图片

情景:小哈现在有n(n<10)张牌,分别编号为1,2,3,4......, 有n个箱子,现在要求每个箱子放一张牌,求出所有牌编号可能的排列顺序

示例代码如下:

#include
int a[10],book[10],n;

void dfs(int step)
{
	int i;
     if(step == n+1)
    {
        for(i =1; i<=n; i++)
        {
            printf("%d",a[i]);
        }
        printf("\n");
        return;    
    }
 
    for(i = 1; i<= n; i++)
    {
        if(book[i] == 0)
        {
            a[step] = i;
            book[i] = 1;
            dfs(step+1);
            book[i] = 0;
        }
    }
    return;
}
int main()
{
	scanf("%d",&n);
	dfs(1);
	getchar();
	getchar();
	return 0;
}

 知识点:

线性表:是N个具有相同特性的数据元素的有限制序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串......

顺序表:

顺序表是用一段物理地址连续的储存单元依次存储数据元素的线性结构,一般情况下采用数组存储

你可能感兴趣的:(学习)