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

那么我们先用一个裸的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. java——形参与实参

    看了很多的文章,稍微有一些的总结:对最基本的形参与实参有了一定的理解,虽然还是不够深入. 1.基本概念 形参:全称为"形式参数"是在定义函数名和函数体的时候使用的参数,目的是用来接 ...

  2. MAC安装flutter开发环境

    #最近在学flutter开发,写一篇记录一下安装的过程 1.配置flutter镜像地址  vim ~/.bash_profile 命令行输入后回车,打开.bash_profile配置镜像地址 expo ...

  3. 常用的数组函数-S

    header('content-type:text/html;charset=utf-8'); //声明一个数组 $arr=['one'=>'aaa','two'=>'bbb','thre ...

  4. 常用的数学函数-S

    // abs — 获取[数值]的绝对值 $; echo abs($int).'<br>'; $float=-2.34; echo abs($float).'<hr>'; //c ...

  5. 接口自动化:pytest----环境搭建

    出处:https://www.cnblogs.com/yoyoketang/p/9356693.html 前言: python鄙视链:pytest 鄙视 > unittest 鄙视 > r ...

  6. python常见的数据转化函数

    python常用类型转换函数 函数格式 使用示例 描述 int(x [,base]) int("8")   可以转换的包括String类型和其他数字类型,但是会丢失精度       ...

  7. 基于Openstack环境下开启SRIOV

    主题思想: 先在系统层面修改配置文件,再去openstack里面修改配置文件 compute node系统层面: 先确认下是否含有ixgbe moudle lsmod |grep ixgbe 修改/e ...

  8. Python字符串练习

    1. 确定一个字符串中有多少个元音字母 def getCount(inputStr): return len([a for a in inputStr if a in "aeiou" ...

  9. SpringBoot四种读取properties文件的方式

    环境:IDEA jdk1.8 SpringBoot2.1.4 例,如下默认application.properties文件   一.使用`@ConfigurationProperties`注解将配置文 ...

  10. JIRA 7.8 版本的安装与破解

    jira的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本 除此之外,我们还需要安装MySQL,为jira创建对应的数据库.用户名和密码,如下: 注意:建库名jira,字符集为U ...