Description

给定一个R*C大小的迷宫,其中R,C均为奇数 迷宫中坐标为两个奇数的点不能通过,称为障碍,迷宫中其他不能通过的点统称为墙壁 坐标为两个偶数的点可以通过,称为房间,迷宫中其他可通过的点称为走廊。迷宫有边界 迷宫中放置有若干个物品(偶数个),物品一定放置在房间中 问如何将这些物品配对可以使得所有物品对之间路径的总和最小,任两条路径不能相交,并求路径

Input

第一行输入为两个整数: R与C(5 ≤ R ≤ 25,5 ≤ C ≤ 80) 其中R为行数,C为列数,R,C均为奇数。 接下来的R行每行包括C个字符,每个字符都是’+’、’|’、’-‘、空格或’X’中的一个,分别表示障碍及两种墙壁、空格表示房间或可通过的走廊,X表示房间中的物品。

Output

输出的第一行是一个整数,即最小分值。
/*
插头DP
这道题看了一晚上了,还是有很多地方不理解,Orz~
*/
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,m,inf,cnt;
int f[][][(<<)+],blo[][][];
char s1[][],s[][];
int dx[]={,-,,};
int dy[]={-,,,};
void upd(int &x,int y){x=min(x,y);}
int trs(int x,int y){
x=(x>>)<<;x|=y&;
x|=((y&)>>)<<m;
return x;
}
int main(){
scanf("%d%d",&n,&m);gets(s1[]+);
for(int i=;i<=n;i++) gets(s1[i]+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
s[j][i]=s1[i][j],cnt+=(s1[i][j]=='X');
swap(n,m);
for(int i=;i<n;i+=)
for(int j=;j<m;j+=)
for(int k=;k<;k++)
blo[i>>][j>>][k]=(s[i+dy[k]][j+dx[k]]!=' ');
n/=;m/=;
memset(f[],0x3f,sizeof(f[]));
inf=f[][][];f[][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
if(j==m)
memset(f[~i&],0x3f,sizeof(f[~i&]));
for(int k=;k<<<m+;k++){
if(f[i&][j][k]==inf) continue;
int *nex;
if(j==m) nex=f[~i&][];
else nex=f[i&][j+];
int v1=blo[i][j][],v2=blo[i][j][],val=f[i&][j][k];
if(s[i<<][j<<]=='X'){
if((k&)==) continue;
if((k&)==){
if(!v2) upd(nex[trs(k,)],val+);
if(!v1) upd(nex[trs(k,)],val+);
}
else upd(nex[trs(k,)],val);
}
else{
if((k&)==) upd(nex[trs(k,)],val+);
else if((k&)==){
upd(nex[trs(k,)],val);
if(!v1&&!v2) upd(nex[trs(k,)],val+);
}
else {
if(!v2) upd(nex[trs(k,)],val+);
if(!v1) upd(nex[trs(k,)],val+);
}
}
}
}
printf("%d\n",f[(n+)&][][]+cnt/);
return ;
}

最新文章

  1. RHEL6.4 + Oracle 11g DG测试环境快速搭建参考
  2. 攻城狮在路上(陆)-- 提交运行MapReduce程序到hadoop集群运行
  3. MVC之前的那点事儿系列(5):Http Pipeline详细分析(下)
  4. rhel7端口开放和查询
  5. MySql错误1045 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password:YES) windows下的解决方案(忘记密码)
  6. iOS Build Setting证书设置
  7. [C和指针]第二部分
  8. 给宏基装WIN8.1系统之问题与解决方法(原创)
  9. 去除下载电影和电视剧文件名中的多余字符[python实现]
  10. 编写一个Shape类,具有属性:周长和面积; 定义其子类三角形和矩形,分别具有求周长的方法。 定义主类E,在其main方法中创建三角形和矩形类的对象, 并赋给Shape类的对象a、b,使用对象a、b来测试其特性。
  11. mysql myisam 锁表问题&lt;转&gt;
  12. 随机抽样一致算法(Random sample consensus,RANSAC)
  13. poj 1948 Triangular Pastures 小结
  14. OpenCV 之 网络摄像头
  15. IdentityServer Topics(2)- 定义资源
  16. CodeChef Cards, bags and coins [DP 泛型背包]
  17. Spring 环境与profile(三)——利用maven的resources、filter和profile实现不同环境使用不同配置文件
  18. NOI2017总结
  19. 力扣(LeetCode)191. 位1的个数
  20. 问题描述: fatal error: &#39;XCTest/XCTest.h&#39; file not found

热门文章

  1. SpringBoot学习1:创建第一个SpringBoot项目
  2. 【前端_js】前端跨网络异步获取资源——fetch()
  3. ASP.NET Core模块化前后端分离快速开发框架介绍之1、开篇
  4. c#用object将datatable快速填充excel后下载表格后打不开的问题
  5. kuangbin 并查集
  6. [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树
  7. SQLite学习和使用
  8. Aizu 2560 Point Distance FFT
  9. cf979d Kuro and GCD and XOR and SUM
  10. VC下如何调用控制台命令以及其他可执行文件