hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771
题目意思:'@' 表示的是起点,'#' 表示的是障碍物不能通过,'.' 表示的是路能通过的;
目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离;
解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点 j 的距离;
然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的;
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
#include<cmath>
using namespace std;
int dir[][]={,,,-,,,-,};
int m,n;
int sx,sy,T;
int ans[][];//点之间的距离
char Map[][];
int vis[][];//标记路径
struct node
{
int x,y,step;
}a[],now,eed;
int bfs(int T1,int ee,int vv)
{
int TT=;
vis[a[T1].x][a[T1].y]=vv;//每次标记的都发生了变化,这样vis数组不用每次都清零
queue< node >p;
now.x = a[T1].x;
now.y = a[T1].y;
now.step = ;
p.push(now);
while(!p.empty())
{
now=p.front();
p.pop();
for(int i=T1+; i<=T; i++)
{
if(now.x == a[i].x && now.y == a[i].y)
{
ans[T1][i]=ans[i][T1] = now.step;
TT++;
}
}
for(int i=; i<; i++)
{
eed.x = now.x + dir[i][]; eed.y = now.y + dir[i][];
if(eed.x>= && eed.x<=m && eed.y>= && eed.y<=n && vis[eed.x][eed.y]!=vv && Map[eed.x][eed.y]!='#')
{
eed.step = now.step+;
vis[eed.x][eed.y] = vv;
p.push(eed);
}
}
if(TT == ee) //如果该访问的点都访问了,直接返回;
return ;
}
return - ;//如果其中有点不能访问到,直接返回-1,输出 -1 ;
} int net[],ans1;
void dfs(int x,int step,int sum)
{
if(step==T)
{
if(ans1>sum) ans1=sum;
return;
}
for(int i=;i<=T;i++)
if(!net[i])
{
net[i]=;
dfs(i,step+,sum+ans[x][i]);
net[i]=;
}
}
int main()
{
int x,y;
// freopen("in1.txt","r",stdin);
// freopen("out1.txt","w",stdout);
while(cin>>m>>n && m+n)
{
ans1=;
memset(ans,,sizeof(ans));
memset(net,,sizeof(net));
memset(vis,,sizeof(vis));
for(int i=; i<=m; i++)
for(int j=; j<=n; j++)
{
scanf(" %c",&Map[i][j]);
if(Map[i][j] == '@')
{
sx= i; sy = j;
}
}
scanf("%d",&T);
a[].x=sx; a[].y=sy;
for(int i=; i<=T; i++)
{
scanf("%d %d",&x,&y);
a[i].x = x;
a[i].y = y;
}
int flag = ;
for(int i = ; i<T; i++)
{ flag = bfs(i,T-i,i+);
if(flag == -)
break;
}
if(flag == -)
printf("-1\n");
else
{
net[]=;
dfs(,,);
printf("%d\n",ans1);
}
}
return ;
}
hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径的更多相关文章
- HDU 4771 Stealing Harry Potter's Precious (2013杭州赛区1002题,bfs,状态压缩)
Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- HDU 4771 Stealing Harry Potter's Precious dfs+bfs
Stealing Harry Potter's Precious Problem Description Harry Potter has some precious. For example, hi ...
- HDU 4771 Stealing Harry Potter's Precious
Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...
- 【HDU 4771 Stealing Harry Potter's Precious】BFS+状压
2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点, ...
- hdu 4771 Stealing Harry Potter's Precious (BFS+状压)
题意: n*m的迷宫,有一些格能走("."),有一些格不能走("#").起始点为"@". 有K个物体.(K<=4),每个物体都是放在& ...
- hdu 4771 Stealing Harry Potter's Precious(bfs)
题目链接:hdu 4771 Stealing Harry Potter's Precious 题目大意:在一个N*M的银行里,贼的位置在'@',如今给出n个宝物的位置.如今贼要将全部的宝物拿到手.问最 ...
- hdu 4771 Stealing Harry Potter's Precious
题目:给出一个二维图,以及一个起点,m个中间点,求出从起点出发,到达每一个中间的最小步数. 思路:由于图的大小最大是100*100,所以要使用bfs求出当中每两个点之间的最小距离.然后依据这些步数,建 ...
- 2013 ACMICPC 杭州现场赛 I题
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #in ...
- 2013 Asia acm Hangzhou Regional Contest 杭州现场赛
B Stealing Harry Potter's Precious 题目大意:给定一个n*m的地图,某些点可以走,某些点可以走某些点不可以走,给定一个起点,又给出了k个点k<=4,要求从起点 ...
随机推荐
- Android疑难杂症之KillProcess 和System.exit 无效
以下所讲,浓缩在 https://github.com/wytings/CrashDemo 首先就这个名字来说,kill了process 或者 system.exit确实已经把APP杀掉了,特别是当你 ...
- @RestController和@Controller的差异
SpringMVC现在使用越来越普及,在使用注解写控制器中发现,需要控制器页面跳转时,需要对类注解为@Controller,而此时,使用freemarker时,在类中写的restful接口会报cann ...
- go语言基础之常量
1.常量 示例: package main //必须有一个main包 import "fmt" func main() { //变量:程序运行期间,可以改变的量, 变量声明需要va ...
- Vue-router路由基础总结(一)
一.安装 npm下载:npm install vue-router 如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:在你的文件夹下的 src 文件夹下的 main.j ...
- IP地址转换、主机大小端、htonl、ntohl实现
copy #include <IOSTREAM> //#include <WINSOCK.H> using std; typedef uint16; unsigned ...
- shell的浮点运算
参考: https://www.linuxquestions.org/questions/linux-software-2/multiply-floats-in-bash-script-618691/ ...
- servlet中ServletConfig的使用
转自:http://www.zzzj.com/html/20090117/69483.html 前言 相对于ServletContext,ServletConfig是针对特定的Servlet的参数或属 ...
- Win7如何修改文件夹的默认视图,如何把详细信息改为平铺视图
先任意进入一个文件夹,右击选择平铺视图. 然后点击左上角的组织,文件夹和搜索选项,在文件夹选项的查看中点击"应用到文件夹",然后点击确定,弹出对话框,再确定. 随后再浏览别 ...
- java中异常介绍
一.异常概述 异常处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++.C#.Ruby.Python等,大都提供了异常处理机制.增加了异常处理机制后的程序有更好的容错性,更加健壮. ...
- 求字符串A与字符串B的最长公共字符串(JAVA)
思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...