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

那么我们先用一个裸的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. 提升算法——Adaboost

    思路:通过改变训练样本权重,学习多个分类器,并将这些分类器进行线性组合,提高分类器性能.大多数提升方法都是改变训练数据的概率分布(数据的权值) 强可学习:存在一个多项式的学习算法能够学习他,并且正确率 ...

  2. myeclipse 修改用户名密码

    当在一台公共的电脑上开发程序时,就需要涉及到更改svn用户名和密码,不然直接用本机用户密码提交,有点不妥. win7系统解决方案: C:\Documents and Settings\Administ ...

  3. mycat练习笔记

    学习要趁早,装逼莫等老. 刚刚开始接触到mycat, 当然要学习一下了.拿它来设置 mysql 的读写分离,分库分表,以及集群等. 官网: http://www.mycat.io/  有详情介绍,有G ...

  4. 怎样检测TCP/UDP端口的连通性

    1 TCP端口的连通性 TC端口的连通性,一般通过telnet检测: TCP协议是面向连接的,可以直接通过telnet命令连接 telnet host-ip port 2 UDP端口的连通性 因为公司 ...

  5. C#获取当前日期时间

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  6. Linux 驱动——Button驱动7(Timer)消抖

    button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...

  7. PXE自动装机

    PXE自动装机 一.搭建PXE远程安装服务器 PXE自动装机需要桌面模式 假如不是桌面模式安装的PXE需要安装桌面模式软件包 yum groupinstall "Desktop" ...

  8. C#中的Cookie

    cookie属性: name字段为一个cookie的名称. value字段为一个cookie的值. domain字段为可以访问此cookie的域名. path字段为可以访问此cookie的页面路径. ...

  9. 如何在运行时(Runtime)获得泛型的真正类型

    前言 由于Java 的类型擦除机制,在编译时泛型都被转为了Object,例如List<String>经过编译之后将变为类型 List.可以通过以下的方式再运行时获得泛型的真正类型 泛型如何 ...

  10. the evolution of Lua 全文翻译

    终于赶在春节前将论文全文翻译完,以后有时间将前面三章重新翻译一次,因为刚开始的时候没打算全文翻译的..第一次每天花25分钟完成这么长的一篇翻译,证明滴水可以穿石,哈哈哈 中文地址:Lua的演进 祝各位 ...