Cleaning Robot (bfs+dfs)
Here, we want to solve path planning for a mobile robot cleaning a rectangular room floor with furniture.

Consider the room floor paved with square tiles whose size fits the cleaning robot (1 * 1). There are 'clean tiles' and 'dirty tiles', and the robot can change a 'dirty tile' to a 'clean tile' by visiting the tile. Also there may be some obstacles (furniture) whose size fits a tile in the room. If there is an obstacle on a tile, the robot cannot visit it. The robot moves to an adjacent tile with one move. The tile onto which the robot moves must be one of four tiles (i.e., east, west, north or south) adjacent to the tile where the robot is present. The robot may visit a tile twice or more.

Your task is to write a program which computes the minimum number of moves for the robot to change all 'dirty tiles' to 'clean tiles', if ever possible.

Input

The input consists of multiple maps, each representing the size and arrangement of the room. A map is given in the following format.

w h 
c11 c12 c13 ... c1w 
c21 c22 c23 ... c2w 
... 
ch1 ch2 ch3 ... chw

The integers w and h are the lengths of the two sides of the floor of the room in terms of widths of floor tiles. w and h are less than or equal to 20. The character cyx represents what is initially on the tile with coordinates (x, y) as follows.

'.' : a clean tile 
'*' : a dirty tile 
'x' : a piece of furniture (obstacle) 
'o' : the robot (initial position)

In the map the number of 'dirty tiles' does not exceed 10. There is only one 'robot'.

The end of the input is indicated by a line containing two zeros.

Output

For each map, your program should output a line containing the minimum number of moves. If the map includes 'dirty tiles' which the robot cannot reach, your program should output -1.

Sample Input

7 5
.......
.o...*.
.......
.*...*.
.......
15 13
.......x.......
...o...x....*..
.......x.......
.......x.......
.......x.......
...............
xxxxx.....xxxxx
...............
.......x.......
.......x.......
.......x.......
..*....x....*..
.......x.......
10 10
..........
..o.......
..........
..........
..........
.....xxxxx
.....x....
.....x.*..
.....x....
.....x....
0 0

Sample Output

8
49
-1
///bfs搜出点与点之间的距离,查找是否联系,然后用dfs来查找最短的点
#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char mp[][];
int dis[][];
int vis[][];
int tag[][];
const int inf = ;
struct node
{
int x,y,step;
} point[]; int w,h,cnt,ans;
void bfs(node fir,int pt)//通过bfs来记录下所有的点的位置
{
queue <node>s;
fir.step=;
while(!s.empty())
s.pop();
vis[fir.x][fir.y]=;
s.push(fir);
while(!s.empty())
{
node t = s.front();
s.pop();
if(mp[t.x][t.y]=='*'||mp[t.x][t.y]=='o')
dis[pt][tag[t.x][t.y]]=t.step;
int next[][]={,,,-,,,-,};
for(int i=;i<;i++)
{
node temp = t;
temp.x+=next[i][];
temp.y+=next[i][];
if(temp.x<||temp.y<||temp.x>h||temp.y>w||vis[temp.x][temp.y]==||mp[temp.x][temp.y]=='x')
{
continue;
}
temp.step+=;
s.push(temp);
vis[temp.x][temp.y]=;
}
}
}
int vist[];
void dfs(int x,int step,int s)
{
if(step==cnt)
{
ans=min(s,ans);
return ;
}
if(s>ans)
return ;
for(int i=;i<=cnt;i++)
{
if(vist[i])
continue ;
vist[i]=;
dfs(i,step+,s+dis[x][i]);
vist[i]=;
}
}
int main()
{
while(scanf("%d%d",&w,&h))
{
if(w==&&h==)
break;
cnt = ;
getchar();
memset(point,,sizeof(point));
memset(tag,,sizeof(tag));
memset(dis,,sizeof(dis));
for(int i=;i<=h;i++)
{
for(int j=;j<=w;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='*')
{
point[++cnt].x=i;
point[cnt].y=j;
tag[i][j]=cnt;
}
else if(mp[i][j]=='o')
{
tag[i][j]=;
point[].x=i;
point[].y=j;
}
}
getchar();
}
for(int i=;i<=cnt;i++)
{
for(int j=;j<=cnt;j++)
{
if(i!=j)
dis[i][j]=inf;
else
dis[i][j]=;
}
}
for(int i=;i<=cnt;i++)
{
memset(vis,,sizeof(vis));
bfs( point[i],i );
} bool flag=;
for(int i=;i<=cnt && flag;i++)
for(int j=;j<=cnt && flag;j++)
if(dis[i][j]==inf)
flag=;
if(!flag)
{
printf("-1\n");
continue;
}
memset(vist,,sizeof(vist));
vist[]=;
ans=inf;
dfs(,,);
printf("%d\n",ans); }
}

2018-11-29

Cleaning Robot (bfs+dfs)的更多相关文章

  1. HOJ 2226&POJ2688 Cleaning Robot(BFS+TSP(状态压缩DP))

    Cleaning Robot Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4264 Accepted: 1713 Descri ...

  2. hdu 4771 求一点遍历全部给定点的最短路(bfs+dfs)

    题目如题.题解如题. 因为目标点最多仅仅有4个,先bfs出俩俩最短路(包含起点).再dfs最短路.)0s1A;(当年弱跪杭州之题,现看如此简单) #include<iostream> #i ...

  3. HDU1254--推箱子(BFS+DFS)

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s) ...

  4. 图的基本遍历算法的实现(BFS & DFS)复习

    #include <stdio.h> #define INF 32767 typedef struct MGraph{ ]; ][]; int ver_num, edge_num; }MG ...

  5. HDU 1044 Collect More Jewels(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. hdu1254(bfs+dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 分析: 真正移动的是箱子,但是要移动箱子需要满足几个条件. 1.移动方向上没有障碍. 2.箱子后 ...

  7. 图的遍历(bfs+dfs)模板

    bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...

  8. UVA1600-Patrol Robot(BFS进阶)

    Problem UVA1600-Patrol Robot Accept:529  Submit:4330 Time Limit: 3000 mSec Problem Description A rob ...

  9. POJ-3083 Children of the Candy Corn (BFS+DFS)

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...

随机推荐

  1. Memcached在Asp.net下的应用

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...

  2. linux socket设置阻塞与非阻塞

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  3. sh_06_函数的返回值

    sh_06_函数的返回值 def sum_2_num(num1, num2): """对两个数字的求和""" result = num1 + ...

  4. Jenkins部署从节点

    由于jenkins上承载项目太多,需要专门的节点来执行需要构建的操作. 参考:https://www.cnblogs.com/lxs1314/p/7551309.html job仅使用绑定的slave ...

  5. [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)

    题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...

  6. Linux shell - shift命令用法(转载)

    位置参数可以用shift命令左移.比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1.$2.$3丢弃,$0不移动.不带参数的shift命令相当于shift 1. 非常 ...

  7. ECMA Script 6新特性之解构赋值

    1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ v ...

  8. 你知道 Git 是如何做版本控制的吗?(转)

    总结:阅读这篇文章需要20分钟 本文是转载自 滴滴WebApp架构组 的一篇文章,文章讲解了神秘的.git目录下的一些文件,最终阐述了git是如何存储数据,及git分支的相关内容. git如何存储数据 ...

  9. Unity3D 连接MySql

    MySql安装如下: https://www.cnblogs.com/dlvguo/p/9671832.html Unity连接MySql首先要在Unity的安装目录D:\Unity2017\Edit ...

  10. JVM监控工具之JProfiler

    一.简介 JProfiler是一款Java的性能监控工具.可以查看当前应用的对象.对象引用.内存.CPU使用情况,线程运行情况(阻塞.等待等),同时可以查找哪个对象占用的内存比较多.哪个对象占用CPU ...