题意:

     给你一个n*m的地图,问你从起点出发,吧所有的宝藏都捡完用的最少时间。

思路:k <= 4,水题,直接开一个数组mark[now][x][y];now代表的是当前检宝藏的二进制压缩状态,然后就直接搜索就行了。


#include<stdio.h>
#include<string.h>
#include<queue> #define N 100 + 5

using namespace
std; typedef struct
{
int
x ,y ,now;
}
NODE; NODE xin ,tou;
int
mark[1<<4][N][N];
int
map[N][N];
int
dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};
NODE K[5];
int
n ,m ,k; bool ok(int x ,int y ,int now)
{
return
x <= n && x >= 1 && y <= m && y >= 1 && !mark[now][x][y] && map[x][y];
} int
BFS(int sx ,int sy)
{

queue<NODE>q;
xin.x = sx ,xin.y = sy ,xin.now = 0;
int
mk = 0;
for(int
i = 1 ;i <= k ;i ++)
if(
xin.x == K[i].x && xin.y == K[i].y)
{

mk = i;
break;
}
if(
mk) xin.now = 0 | (1 << (mk - 1));
memset(mark ,0 ,sizeof(mark));
q.push(xin);
mark[xin.now][xin.x][xin.y] = 1;
while(!
q.empty())
{

tou = q.front();
q.pop();
if(
tou.now == (1<<k) - 1)
return
mark[tou.now][tou.x][tou.y] - 1;
for(int
i = 0 ;i < 4 ;i ++)
{

xin.x = tou.x + dir[i][0];
xin.y = tou.y + dir[i][1];
xin.now = tou.now;
int
mk = 0;
for(int
j = 1 ;j <= k ;j ++)
if(
xin.x == K[j].x && xin.y == K[j].y)
{

mk = j;
break;
}
if(
mk) xin.now = tou.now | (1<<(mk - 1));
if(
ok(xin.x ,xin.y ,xin.now))
{

mark[xin.now][xin.x][xin.y] = mark[tou.now][tou.x][tou.y] + 1;
q.push(xin);
}
}
}
return -
1;
} int main ()
{
int
i ,j ,sx ,sy;
char
str[N];
while(~
scanf("%d %d" ,&n ,&m) && n + m)
{
for(
i = 1 ;i <= n ;i ++)
{

scanf("%s" ,str);
for(
j = 1 ;j <= m ;j ++)
{
if(
str[j-1] == '@')
map[i][j] = 1 ,sx = i ,sy = j;
if(
str[j-1] == '.') map[i][j] = 1;
if(
str[j-1] == '#') map[i][j] = 0;
}
}

scanf("%d" ,&k);
for(
i = 1 ;i <= k ;i ++)
scanf("%d %d" ,&K[i].x ,&K[i].y);
printf("%d\n" ,BFS(sx ,sy));
}
return
0;
}

最新文章

  1. 如何打开VPK文件?里面究竟有什么?
  2. windows中安装node.js和测试
  3. 攻城狮在路上(叁)Linux(十九)--- 磁盘分区
  4. SQL Server 跨库连接
  5. SparkSQL之数据源
  6. 【DOM】1.DOM优化
  7. eclipse创建maven模块工程
  8. Android使用开源框架加载图片
  9. quartz简单实现
  10. Java中的自动装箱与拆箱
  11. 2.1 Word 插入 smartart、图表
  12. Tomcat启动慢解决方法(本人CentOS7.4系统)
  13. SpringBoot SpringSecurity4整合,灵活权限配置,弃用注解方式.
  14. js中 ajax动态新增节点无法触发点击事件
  15. 查看手机cpu信息
  16. [杂谈] 一个关于 as 的小测试
  17. 简单的django配置和命令
  18. 3D单机游戏《天鹰教》源码发布(二)
  19. 97 条 Linux 常用命令及Vim命令总结
  20. [redis]复制机制,调优,故障排查

热门文章

  1. 如何进BAT,有了这个篇面试秘籍,成功率高达80%!!(附资料)
  2. 《C++ Primer》笔记 第13章 拷贝控制
  3. PCA——主成分分析
  4. 2020年12月-第02阶段-前端基础-CSS Day05
  5. 面试被吊打系列 - Redis原理
  6. MyBatis(四):自定义持久层框架优化
  7. 一个mac软件合集的网站
  8. java实现一个点餐系统
  9. python-自定义一个序列
  10. 关于Handler同步屏障你可能不知道的问题