剑之修炼

jzoj 2130

题目大意:

在一个位置上有一个人,同时还有NNN(N⩽10N \leqslant 10N⩽10)个怪物,这个人会不停地释放技能,技能可以瞬间杀死周围8个格子上的怪物,行走速度是每个单位时间走一个单位距离,现在问这个人最快要多久才能杀死所有怪物(还要输出路径)

输入:

输入是先输入地图范围S和怪兽数量N,然后输入此人位置,接下来n行,每行表示怪兽的位置

输入样例#1

 5 32 21 13 31 2

输出样例#1

0

输入样例#2

5 3
3 3
1 1
5 5
1 5

输出样例#2

6
3 2
2 2
2 3
2 4
3 4
4 4

数据范围

5⩽S⩽305 \leqslant S \leqslant 305⩽S⩽30
N⩽10N \leqslant 10N⩽10

解题思路:

用状压DP压缩杀怪状态,然后设f[s][i][j]f[s][i][j]f[s][i][j]为杀怪状态为s,且现在在iii怪的j方向上j方向上j方向上,然后每一次枚举从哪个位置到那个位置,然后路径只要在DP的时候记录一下即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#define abs(x) (x)<0?-(x):(x)
using namespace std;
int n,m,ans,sum,x[20],y[20],f[(1<<12)][20][10],s[(1<<12)][20][10],s1[(1<<12)][20][10];
const int dx[9]={0,1,1,1,0,-1,-1,-1,0};
const int dy[9]={1,1,0,-1,-1,-1,0,1,0};
int dis(int from,int fw,int to,int tw)//计算两个点的距离
{int x1,x2,y1,y2;x1=x[from]+dx[fw];y1=y[from]+dy[fw];x2=x[to]+dx[tw];y2=y[to]+dy[tw];if ((abs(x1-x2))+(abs(y1-y2))<0){x1=1;}return (abs(x1-x2))+(abs(y1-y2));
}
void dg(int S,int dep,int w)
{if (S==1) return;int x1,x2,y1,y2,xx,yy;dg(S-(1<<dep),s[S][dep][w],s1[S][dep][w]);//递归下去x1=x[s[S][dep][w]]+dx[s1[S][dep][w]];//两个点的坐标(from和to)y1=y[s[S][dep][w]]+dy[s1[S][dep][w]];x2=x[dep]+dx[w];y2=y[dep]+dy[w];if (x1<x2) xx=1;//预处理else xx=-1;if (y1<y2) yy=1;else yy=-1;while (x1!=x2)//往x2走{x1+=xx;printf("\n%d %d",x1,y1);}while (y1!=y2){y1+=yy;printf("\n%d %d",x1,y1);}
}
int main()
{memset(f,127/3,sizeof(f)); scanf("%d %d %d %d",&m,&n,&x[0],&y[0]);f[1][0][8]=0;for (int i=1;i<=n;++i)scanf("%d %d",&x[i],&y[i]);for (int i=1;i<=(1<<n+1)-1;++i)//枚举状态for (int to=1;to<=n;++to)//枚举到的点if (i&(1<<to))//存在for (int from=0;from<=n;++from)//从哪里来if ((i&(1<<from)||from==0)&&from!=to)//存在且不相同for (int tw=0;tw<=8;++tw)//在to的那个方向if (x[to]+dx[tw]>0&&x[to]+dx[tw]<=m&&y[to]+dy[tw]>0&&y[to]+dy[tw]<=m)//没出界for (int fw=0;fw<=8;++fw)//在from的那个方向if (x[from]+dx[fw]>0&&x[from]+dx[fw]<=m&&y[from]+dy[fw]>0&&y[from]+dy[fw]<=m)//没出界if (f[i-(1<<to)][from][fw]+dis(from,fw,to,tw)<f[i][to][tw])//更优{f[i][to][tw]=f[i-(1<<to)][from][fw]+dis(from,fw,to,tw);//更新s[i][to][tw]=from;//记录路径s1[i][to][tw]=fw;}int k=(1<<n+1)-1;for (int i=1;i<=n;++i)for (int j=0;j<=9;++j)if (f[k][ans][sum]>f[k][i][j])//取最大ans=i,sum=j;printf("%d",f[k][ans][sum]);if (f[k][ans][sum]) dg(k,ans,sum);//递归输出return 0;
}

【状压DP】剑之修炼(jzoj 2130)相关推荐

  1. [状压DP][BFS][哈希]JZOJ 3243 Cube

    Description 你被困在一个密室里.经过一轮摸索,你在密室里有所发现: 1.密室是一个呈m×n网格的长方形,地面有六个格子被上了色: 2.密室地面部分格子可能有障碍物: 3.密室的某一格有一个 ...

  2. 【状压DP】最优配对问题(jzoj 3420)

    最优配对问题 jzoj 3420 题目大意: 在平面上有n个点,现在要把他们拼成n/2对,拼接两个点的代价是他们的平面距离,现在问代价总和最小是多少 输入样例 4 8730 9323 -3374 39 ...

  3. [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)

    传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...

  4. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  5. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  6. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  9. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

最新文章

  1. 检查Lync SRV记录是否正常
  2. 轻松实现远程批量拷贝文件脚本(女学生作品)
  3. Mysql:增加用户和密码,赋予权限
  4. 微软Azure storage account的connection string
  5. 从零开始学视觉Transformer (11):目标检测DETR-2
  6. 第8章6节MonkeyRunner启动运行过程-启动Monkey 2
  7. c# 中对于每次修改的程序 都必须重新手动生成 才能编译的问题
  8. pytorch 实现 LSTM AutoEncoder 与案例
  9. 车贷P2P平台设计市场需求文档(MRD)
  10. Java语言基础(4)
  11. 做梦都没想到,就这样得到了一位大佬的青睐
  12. 《路由器开发 - 路由器刷机指南》联想Newifi Y1刷机
  13. 解决ie浏览器兼容ES6语法问题
  14. Win10系统截图新工具的快捷键
  15. ABP中的数据过滤器
  16. 计算机死机后 通过任务管理器关闭程序,电脑死机后,按哪个键结束程序
  17. [JS jQuery项目]仿网易云音乐项目问题摘要
  18. AOSP 源代码标记和 build
  19. Sapphire应用场景剖析 | 基于行业首个隐私EVM构建DApp
  20. 计算机游戏155,MAME0.155经典1430款游戏合集

热门文章

  1. linux强大功能,linux grep和find 的强大功能
  2. 5120v2怎么配置web登陆_阿里企业邮箱如何配置和添加到第三个电子邮件客户端中?...
  3. android+百度lbs云,百度——LBS.云 v2.0——云存储扩展字段——Android
  4. eclipse 输入卡顿_7个小技巧,解决eclipse卡顿问题
  5. 用python实现流程自动化_Python自动化开发 - 流程控制
  6. 机器学习之超参数调优——超参数调优的方法
  7. 软件构造学习笔记-第四周
  8. 高等数学下-赵立军-北京大学出版社-题解-练习8.4
  9. C语言 ---文件读取
  10. java蝇量模式_Head First设计模式——蝇量和解释器模式