Download presentation
Presentation is loading. Please wait.
1
课前实践 https://vijos.org/p/1200 描述
输入一个整数n(1000>=n>=0) 输出n的阶乘各个位的数相加的和y,最后再输出T或F, 代表y是否为素数。 格式 输入格式 输入一个整数n(1000>=n>=0) 输出格式 输出n的阶乘各个位的数相加的和y,最后再输出对y是否为素数的判断, 是为T否为F。 样例1 样例输入1 10 样例输出1 27F
2
信息学竞赛培训 深度优先搜索!
3
深度优先搜索(DFS) 一条道走到黑 如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。它的基本思想是:
为了求得问题的解,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。 深度优先搜索的实现方式可以采用递归或者栈来实现。
4
走迷宫
5
预处理 为防止搜索时越界,我们给迷宫外围加上一道“墙”。
6
算法核心描述 void DFS(int r,int c)//r行,c列{ 如果已经到达m,n的位置{ 说明找到一种可行的解 }
7
算法操作 判断: 1、判断是否能被拓展条件; 1)当前位置在地图中不是“墙”; 2)当前位置没有被走过 拓展 2、拓展当前点
1)继续以当前点往下搜索
8
算法伪代码 void DFS(int r,int c){ if(r==m&&c==n){ 输出一种可行解,结束程序 }
visited[r][c]=true;标记被走过 if(上边可走) expand(上边); if(下边可走) expand(下边); if(左边可走) expand(左边); if(右边可走) expand(右边);
9
算法伪代码 #define isok(a,b) 该点不是墙&&该点没走过
#define expand(a,b) {DFS(a,b);重置(a,b)访问标记} #define isok(a,b) map[a][b]!=‘1’&&visited[a][b]==false #define expand(a,b) {DFS(a,b);visited[a][b]=false;}
10
void DFS(int r,int c){ if(r==m&&c==n){ count++; return; } visited[r][c]=true;标记被走过 if(isok(r-1,c)) expand(r-1,c);//上 if(isok(r+1,c)) expand(r+1,c);//下 if(isok(r,c-1)) expand(r,c-1);//左 if(isok(r,c+1)) expand(r,c+1);//右
11
N皇后问题 问题描述: 在国际象棋中,皇后可以攻击与她在同一水平线、垂直线、对角线的棋子。现在有一张N*N的国际象棋棋盘,在上面放置N个皇后。有多少种使皇后不能相互攻击的方案?其中(N<=13),如果可以,深度输出各个方案
12
算法应用 勇者斗恶龙 你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。 输入格式 输入包含多组数据。每组数据的第一行为正整数n和m(1<=n,m<=20000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为一个整数,即每个骑士的能力。输入结束标志为n=m=0 输出格式 对于每组数据,输出最少花费。如果无解,输出”Loowater is doomed!”. 输入样例 2 3 5 4 7 8 2 1 10 0 0 输出样例 11 Loowater is doomed!
Similar presentations