博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
acm Sheep Frenzy(状态压缩+BFS)
阅读量:4129 次
发布时间:2019-05-25

本文共 1413 字,大约阅读时间需要 4 分钟。

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12511

题目大意:给定一个矩阵:“#”代表绵羊,“X”代表山不能走,‘’。‘代表草坪能走;“U”代表起始点;问从起始点开始,能否把所有的绵羊都吃掉,

如果能问,最好花多少时间?

解题报告人:GHQ(SpringWater)

解题思路:考虑到绵羊的总是最多为16,将开始点考虑进去共17个点,所以只用先用BFS求出这17个点的相互距离,之后再利用状态压缩,

dp【i】【j】=min(dp【i】【j】,dp【i^(1<<j)】【k】+dis【j】【k】+1);表示,在状态i下,j最后访问,的最小时间消费值;

最终的ans=min(dp【up】【j】)

代码如下:

#include
#include
#include
#include
using namespace std;const int S = (1 << 17);const int inf = 1<<29;char mat[55][55];int rem[20], cnt, dis[20][20];int d[55][55];int dx[]={0,0,-1,1};int dy[]={-1,1,0,0};int dp[S][17];int N,M;bool isok(int x,int y){ if(x<0||y<0||x>=N||y>=M||mat[x][y]=='X')return false; return true;}void bfs(int x,int y){ int tx,ty,i,j; int xx = x; int yy = y; queue
qx,qy; qx.push(x); qy.push(y); for(i = 0; i < N; ++ i) for(j = 0; j < M; ++ j) d[i][j]=inf; d[x][y]=0; while(!qx.empty()){ x = qx.front(); qx.pop(); y = qy.front(); qy.pop(); for(i = 0; i < 4; ++ i){ tx = x + dx[i]; ty = y + dy[i]; if(!isok(tx,ty)||d[x][y]+1>=d[tx][ty])continue; d[tx][ty] = d[x][y] + 1; qx.push(tx); qy.push(ty); } }}int min(int a,int b){ return (a
cnt) { for(i = 1; i <= cnt; i++) { bfs(rem[i]/M, rem[i]%M); for(j = 1; j <= cnt; j++) dis[j][i]=dis[i][j]=d[rem[j]/M][rem[j]%M]; } up = ( 1 << (cnt) ) - 1; DP(up); up=(up<<1)|1; for(i=0, ans = inf; i <= cnt; i++) { if(dp[up][i]

转载地址:http://hhuvi.baihongyu.com/

你可能感兴趣的文章
【JAVA数据结构】先进先出队列
查看>>
Objective-C 基础入门(一)
查看>>
Flutter Boost的router管理
查看>>
iOS开发支付集成之微信支付
查看>>
C++模板
查看>>
【C#】如何实现一个迭代器
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
VUe+webpack构建单页router应用(一)
查看>>
Node.js-模块和包
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
PHP 7 的五大新特性
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
OpenCV gpu模块样例注释:video_reader.cpp
查看>>
就在昨天,全球 42 亿 IPv4 地址宣告耗尽!
查看>>
Mysql复制表以及复制数据库
查看>>
Linux分区方案
查看>>
如何使用 systemd 中的定时器
查看>>