搜索(DFS)
不知道为什么~除了我室友其他的同学都觉得DFS很简单~且比BFS容易得多........我真心不觉得啊T T~我真心觉得BFS比DFS简单得多................= =
为了把DFS完全搞懂,决定做一些DFS的题目.......
HDU 2181 哈密顿绕行世界问题
题意:
给出每个城市与之相连的三个城市的编号,求出给定城市环游所有城市,并回到给定城市的所有路线~按字典序输出~
是一道简单的DFS题目~只要注意输出的第一个和最后一个都是给定城市,以及哈密顿所走城市数即可~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int a[][],b[],c[],n,cas; void DFS(int x,int step)
{
int i,j,t;
for(i=;i<;i++)
{
t=a[x][i];
if(t==n && step==)
{
printf("%d: ",++cas);
for(j=;j<=;j++)
printf(" %d",c[j]);
printf("\n");
}
else
if(b[t]==)
{
b[t]=;
c[step+]=t;
DFS(t,step+);
b[t]=;
}
}
return;
} int main()
{
int i;
for(i=;i<=;i++)
scanf("%d%d%d",&a[i][],&a[i][],&a[i][]);
while(scanf("%d",&n),n)
{
cas=;
memset(b,,sizeof(b));
b[n]=;
c[]=c[]=n;
DFS(n,);
}
return ;
}
//memory:228KB time:0ms
HDU 1312 Red and Black
题意:找出与'@'相连的'.'的个数('@'也算在内~)
也可以用BFS做,不过是在练DFS嘛~就只写了DFS的代码~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std; int m,n,number,add[][]={{,},{,-},{,},{-,}};
char a[][]; void DFS(int x,int y,int step)
{
int i,hx,hy;
for(i=;i<;i++)
{
hx=x+add[i][];
hy=y+add[i][];
if(a[hx][hy]=='.')
{
a[hx][hy]='#';
number++;
DFS(hx,hy,step+);
}
}
} int main()
{
int i,j;
while(scanf("%d%d",&m,&n),m,n)
{
memset(a,,sizeof(a));
for(i=;i<n;i++)
scanf("%s",a[i]);
for(i=;i<n;i++)
for(j=;j<m;j++)
if(a[i][j]=='@')
{
number=;
DFS(i,j,);
break;
}
printf("%d\n",number);
}
return ;
}
//memory:232KB time:15ms
WA一次是地图开小了一点~~~
HDU 1010 Tempter of the Bone
题意:给出出发点'S'、结束点'D'以及时间Time,看是否能恰好在Time时间上由'D'到达'S'上。其中'X'是不能走的~
在此题上要注意剪枝~我由于没有剪枝,结果TLE了......T T
看了网上的结题报告,发现要用到”奇偶剪枝“~~~
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; char a[][];
int m,n,time,temp,x1,x2,y1,y2,minn,add[][]={{,},{-,},{,},{,-}};
bool ID; void DFS(int x,int y,int step)
{
int i,hx,hy;
if(x<= || y<= || x>m || y>n || step>time)
return;
if(x==x2 && y==y2 && step==time)
{
ID=true;
return;
}
if(ID) return;
temp=time-step-abs(x-x2)-abs(y-y2);
if(temp< || temp&) return;
for(i=;i<;i++)
{
hx=x+add[i][];
hy=y+add[i][];
if(a[hx][hy]!='X')
{
a[hx][hy]='X';
DFS(hx,hy,step+);
a[hx][hy]='.';
}
}
return;
} int main()
{
int i,j,k;
while(scanf("%d%d%d",&m,&n,&time),m,n,time)
{
// memset(a,0,sizeof(a));
ID=false;
k=;
for(i=;i<=m;i++)
for(j=;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='S')
{
x1=i;
y1=j;
}
if(a[i][j]=='D')
{
x2=i;
y2=j;
}
if(a[i][j]=='X')
++k;
}
if(m*n-k<=time)
{
printf("NO\n");
continue;
}
a[x1][y1]='X';
DFS(x1,y1,);
if(ID) printf("YES\n");
else printf("NO\n");
}
return ;
}
搜索(DFS)的更多相关文章
- 简单搜索dfs, 简单的修剪搜索
选择最合适的语言做一个项目是非常重要的.但,熟练的掌握自己的武器,这也是非常重要的. ========================================================= ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- POJ 2243 简单搜索 (DFS BFS A*)
题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次. 求最少明显用bfs,下面给出三种搜索算法程序: // BFS #include<cstdio> #i ...
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- 深度优先搜索 DFS 学习笔记
深度优先搜索 学习笔记 引入 深度优先搜索 DFS 是图论中最基础,最重要的算法之一.DFS 是一种盲目搜寻法,也就是在每个点 \(u\) 上,任选一条边 DFS,直到回溯到 \(u\) 时才选择别的 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
随机推荐
- SQL Trigger(触发器)
1.触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程. 2.触发器一般用在check约束更加复杂的约束上面. 3.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作. 4.upd ...
- JS进制转换,浮点数相加,数字判断
document.write("整数转换函数:parseInt(数据,底数)<br>"); document.write("10101=>" ...
- python实现雅虎拍卖后台自动回复卖家消息
前些时间,公司让做一个自动回复卖家信息的程序,现在总结下(用python实现的) 1.登陆雅虎拍卖后台手动获取cookie文件 #coding=utf-8 import sqlite3 import ...
- 双数组Trie树 (Double-array Trie) 及其应用
双数组Trie树(Double-array Trie, DAT)是由三个日本人提出的一种Trie树的高效实现 [1],兼顾了查询效率与空间存储.Ansj便是用DAT(虽然作者宣称是三数组Trie树,但 ...
- cmd下运行java文件时,找不到或无法加载主类的解决方法
最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示:
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- Cordova 设置全屏及退出全屏切换
设置全屏在super.init();之前 最后才退出全屏. 以下为具体代码: package com.agile.ittm; import android.os.Bundle; import andr ...
- 在Eclipse中安装ADT
启动 Eclipse,然后选择 Help > Software Updates….在出现的对话框中,单击 Available Software 选项卡. 单击 Add Site 在 Add Si ...
- C# 判断系统空闲(键盘、鼠标不操作一段时间)
利用windows API函数 GetLastInputInfo()来判断系统空闲 //添加引用 using System.Runtime.InteropServices; // 创建结构体用于返回捕 ...
- 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
1319: Sgu261Discrete Roots Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 389 Solved: 172 Descriptio ...