DFS最棒—失恋巧克力职人

失恋巧克力职人之巧克力布置挑战
在《失恋巧克力职人》的故事背景下,爽太为了给纱绘子带来每日的新鲜感,开设了自己的巧克力店并面临一个有趣的数学挑战:如何在不规则分布的柜台位置上布置四种不同类型的巧克力,确保每天的布置都不相同,且相同类型的巧克力不会相邻。通过使用深度优先搜索算法(DFS),我们探索所有可能的布置方案。

失恋巧克力职人
Description
纱绘子喜欢巧克力,尤其喜欢巴黎“幸福工坊”的巧克力。
爽太为了追求深爱的纱绘子,远赴巴黎“幸福工坊”见习,梦想着有朝一日能回到日本开一间巧克力店,做出纱绘子最爱的巧克力——这样,纱绘子就一定会每天都来光顾吧!那么每天都能见到纱绘子了吧!
爽太的梦想实现了——他开了自己的巧克力店“choco la vie”,将记忆里纱绘子的口味与巴黎的技艺相结合,设计出了以bonbon巧克力、糖渍橙皮巧克力为代表的四种巧克力。纱绘子也如愿每日笑着前来:“每天都能吃到这样的巧克力,真是太幸福了!”
爽太每天都要将新鲜出炉的巧克力在柜台上固定的一些位置摆放满。为了给纱绘子带来新鲜感,他希望每天巧克力的布置都不一样,并且两个相同种类的巧克力不能相邻摆放——“不然就太无聊了!”他想知道,一共有几种布置巧克力的方案。
这里要注意的是,柜台能放巧克力的位置虽然固定,但却不是规则分布的。因此我们会将相邻的位置一对对地给出。
Input (From File: colour.in)
第一行两个数N和M,表示放巧克力的位置的个数和相邻的位置的对数。
接下来M行,每行一组数A,B表示A,B相邻。
Output (To File: colour.out)
一个数,表示巧克力布置的方法数。
Sample Input 1
5 4
1 2
1 3
1 4
1 5
Sample Output 1
324
Hint
40%的数据N <=5
100%的数据N <= 10, M <= 50
方法:这题其实是一个简单DFS(深搜),感谢霍普克洛夫特特与罗伯特•塔扬,发明了深搜。算了,不说题外话了。这题的主要思路先用数组连接每个相邻的巧克力格,再是搜索每个巧克力格。在放入巧克力前,我们要与前面有放过巧克力的格子进行比较,如果巧克力有相连的关系,并且自己格子准备放的巧克力和相连的格子里已经放的巧克力一样的话,就不放这种巧克力。并将巧克力放满了后统计次数,最后输出。
Ok,要讲的都讲了,让我们用热烈的掌声欢迎这题的——代码!
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
bool p[20][20];
int a[20];
int math(int x,int t) //判断放置是否合法
{
for(int i=1;i<x;i++)
if(p[x][i]==1&&a[i]==t)
return 0;
return 1;
}
void fun(int x) //深搜标准模板之一
{
if(x>n)
{
ans++;
return ;
}
for(int i=1;i<=4;i++)
if(math(x,i)==1)
{
a[x]=i;
fun(x+1);
a[x]=0;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
p[x][y]=p[y][x]=1; //用数组证明这两个巧克力格是有相连的,类似图
}
fun(1);//DFS
cout<<ans;
return 0;
}//本文仅供产考,抄袭套作遭雷劈!!!

### DFS算法概述 深度优先搜索(Depth-First Search, DFS)是一种用于遍历图或树的常用算法。它通过尽可能深地探索节点的方式完成整个结构的遍历。DFS可以应用于多种场景,例如路径查找、连通分量检测以及拓扑排序等问题。 #### 优解与实现方式 在实际应用中,为了提高效率并降低不必要的计算开销,可以通过剪枝技术优化DFS过程。所谓剪枝是指提前终止某些分支的进一步扩展,从而减少无意义的操作次数[^2]。下面展示了一个基于Python语言的经典DFS框架: ```python def dfs(node, visited): if node is None: return # 访问当前结点 print(f"Visiting {node}") # 将其标记为已访问状态 visited.add(node) # 遍历相邻节点 for neighbor in get_neighbors(node): if neighbor not in visited: dfs(neighbor, visited) # 初始化调用 start_node = ... # 定义起始节点 visited_set = set() # 创建集合存储已经访问过的节点 dfs(start_node, visited_set) ``` 此代码片段展示了如何利用递归来执行基本形式下的DFS逻辑[^1]。 #### 时间复杂度分析 通常情况下,如果给定的是具有V个顶点E条边的图,则标准版本下运行一次完整的DFS所需时间为O(V+E),因为每个顶点多只会被处理一遍而每条边也仅会考虑两次(针对有向图而言是一次)。然而,在特定条件下比如当存在大量重复子问题或者约束条件较弱时,原始方案可能变得低效甚至无法满足性能需求;这时就需要引入诸如记忆化搜索之类的改进措施来达到更佳效果。 #### 空间复杂度考量 由于采用栈机制模拟递归流程的缘故,坏情形下的额外内存消耗主要由递归层数决定——即等于从根到叶子长链路上经过的所有节点数目之总和。因此理论上讲,对于一棵高度h的二叉树来说,所需的辅助空间大约处于范围Ω(h)至Θ(n)[^1]之间变化不定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值