这道题让我们求一个地图上的各个点之间的最短路径说白了旅行商问题。

那么我们先用一个裸的BFS求出各个点之间的最短距离,然后我们再枚举各个点的全排列即可

这道题的细节很多,详见注释

上代码~

 #include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int d[][];int w;int h;
char map[][];bool vis[][];
int dx[]={,-,,};int dy[]={,,-,};
int res;
struct data
{
int x;int y;int step;
}n[],now;int cnt;
inline int s(int x,int y)//强制转换点坐标为点号
{
for(int i=;i<=cnt;i++)
if(n[i].x==x&&n[i].y==y)
return i;
return ;
}
queue <data> q;
int c[];
void clear()//因为每一个点都要bfs所以搜一次清空一次
{
while(!q.empty())
{
q.pop();
}
for(int i=;i<h;i++)
for(int j=;j<w;j++)
vis[i][j]=false;
return;
}
int main()
{
while()
{
res=0x3f3f3f3f;cnt=;//多组询问的时候记得赋变量初值
scanf("%d%d",&w,&h);
if(w==&&h==)break;
for(int i=;i<h;i++)
{
scanf("%s",map[i]);
for(int j=;j<w;j++)
{
if(map[i][j]=='*')
{
n[++cnt].x=i;n[cnt].y=j;
}
else if(map[i][j]=='o')
{
n[].x=i;n[].y=j;
}
}
}
for(int i=;i<=cnt;i++)//记得清空邻接矩阵
{
for(int j=;j<=cnt;j++)
{
d[i][j]=;
}
}
for(int i=;i<=cnt;i++)//裸的bfs
{
q.push(n[i]);
//printf("STARTFROM%d\n",i);
vis[n[i].x][n[i].y]=true;
int rep=cnt;
while(!q.empty())
{
now=q.front();q.pop();
int x=now.x;int y=now.y;
//printf("nowis(%d,%d)\n",x,y);
for(int k=;k<;k++)
{
if(x+dx[k]<||x+dx[k]>=h||y+dy[k]<||y+dy[k]>=w||
vis[x+dx[k]][y+dy[k]]||map[x+dx[k]][y+dy[k]]=='x')//地图中是小写的x
continue;
if(map[x+dx[k]][y+dy[k]]=='*'||map[x+dx[k]][y+dy[k]]=='o')
{
int t=s(x+dx[k],y+dy[k]);
//printf("REACH%d,DISis%d\n",t,now.step+1);
d[i][t]=now.step+;
d[t][i]=now.step+;
rep--;
if(rep==)goto nxt;
}
vis[x+dx[k]][y+dy[k]]=true;
data p;p.x=x+dx[k];p.y=y+dy[k];p.step=now.step+;
q.push(p);
}
}
nxt:;
clear();
}
for(int i=;i<=cnt;i++)
{
c[i]=i;
//printf("node%dis(%d,%d)\n",i,n[i].x,n[i].y);
}
int rep;
/*for(int i=0;i<=cnt;i++)
{
for(int j=0;j<=cnt;j++)
{
printf("%-3d",d[i][j]);
}
printf("\n");
}*/
do
{
rep=;
for(int i=;i<cnt;i++)
{
//printf("%-2d",c[i]);
if(d[c[i]][c[i+]]==)
{
printf("-1\n");goto ed;
}
rep+=d[c[i]][c[i+]];
}
//printf("%-2d",c[cnt]);
//printf("%-5d",rep);
if(res>rep)res=rep;
//printf("\n");
}while(next_permutation(c+,c+cnt+));//枚举全排列
printf("%d\n",res);
ed:;
}
return ;//拜拜程序~
}

Poj2688cleaningrobot的更多相关文章

随机推荐

  1. Spring 基础知识(二)Spring的bean初始化与生命周期,以及注入

    Spring bean 初始化: 参考博文: https://www.cnblogs.com/luyanliang/p/5567164.html 1. 加载xml 文件. 扫描注解 ,形成bean定义 ...

  2. FZU-Problem 2294 Uint47 calculator

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2294 题意:按照所给负号进行赋值.加.减乘.除和取余的操作. 解题思路:用map来存储字符串与值之间的对应关系 ...

  3. jQuery的 ready() 和原生 Js onload() 的主要区别:

    1. onload() 会等到DOM 元素和图片都加载完毕后才执行:raeady()会等到DOM元素加载完毕,但不会等到图片加载完毕就会执行. 2.onload() 如果编写了多个,则后面的会覆盖掉前 ...

  4. Shiro的认识

    #2019.2.2 Apache Shiro是基于java的一个安全框架.他帮助我们完成:认证.授权.加密.会话管理.web集成.缓存等问题. 在了Shiro之前,先要了解一下什么是权限管理? 权限管 ...

  5. python命令随记

    1. pip版本需要升级命令: python -m pip install --upgrade pip 2.查找Django命令 pip show django 3.查看python安装目录 进入Py ...

  6. debian系linux墙内安装安全工具集

    虽然有kali linux这样集合了很多安全工具的操作系统,但是kali的软件源相对老旧,没有ubuntu等主流debian系统丰富,kali默认使用su权限进入图形化界面也是违背linux权限机制的 ...

  7. red hat下Oracle服务自启动的方法

    setup .rc.local 和chkconfig三种方式都可以设置 第一种)输入#setup指令进入系统服务菜单,选择你想启动的服务比如oralce,然后重起机器或者/etc/rc.d./init ...

  8. python学习之路之int()奇怪的报错

    今天闲来无事看了下python基础知识,当学到数据类型转换的int()方法时候.发现了这么一个有意思的事情,算是IDE或是解释器的一个小BUG.(具体原因暂不明,留待以后查找问题) 先讲下环境 操作系 ...

  9. 201771010141 周强《面向对象程序设计(java)》第十三周学习总结

    实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机制: (3) 掌握事件处理的基本编程模型: (4) 了解GUI界面组件观感设置方法: (5) 掌握Win ...

  10. 按照不规则多边形shp文件分割底层栅格文件tif,统计不同栅格的属性值

    我想做到,按照voronoi多边形分割地图土地利用类型文件,统计每个多边形内不同地物的种类和数量.-----如图: 我的第一个想法是:首先用上层多边形将下层栅格图切割开来,然后就可以分别统计栅格内的地 ...