SRM340 VegetableGarden
Description
你的蔬菜园形成了一个矩形网格。你决定检查一些小块土地。从左上角开始,你将走过菜园,回到起点。现在你想要检查一下菜园内的田地,于是你决定从左上角出发,在菜园里走一圈回到原处。最后,所有在你走过的这个环内的田地都被认为检查过了。为了保护植 物,你的路径只能在田地边界的小路上走,不能走到田地里面。并且你走过的路径不能自交,小路保证足够宽,你可以多次沿着一条小路走,并且这些路径都不相 交。先在给你菜园的地图,其中有的田地标记为”I”,表示这些田地是你想要检查的;有的田地被标记为”X”,表示这些田地是你不想检查的;有的田地被标记为”.”,表示这些田地你不关心。假设菜园中有K个”I”,那么你要返回K个数字,其中第i个数为:恰好检查任意i个标记为”I”的田地,并且没有检查任何一个标记为”X”的田地的最短路。
【输入格式】
n 行,每行 m 个字符。
'I'表示重要的格子,'X'表示有坏处的格子,'.'表示其他格子。
【输出格式】
输出重要的格子数行,第 i 行表示圈住 i 个重要的格子的最小
路径长度。
【输入样例】
X.I
.I.
I..
【输出样例】
8
10
14
判断一个格子是否被圈住,可以看它上面是否有奇数条边
如果是奇数,那么就需要从下面连回起点
用$dist[x][y][S]$表示到$(x,y)$,关键点上面的边数的奇偶性状态S
广搜更新$dist$数组
复杂度$O(n^{2}*10*2^{10})$
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct ZYYS
{
int x,y,s;
};
const int dx[]={,,,-},dy[]={,-,,};
int n,m,cnt,x[],y[],pd[],dist[][][<<],ans[],inf,tot,Max;
bool vis[][][<<];
char s[][];
queue<ZYYS>Q;
int get(int S,int xx,int yy)
{int i;
for (i=;i<=cnt;i++)
{
if (yy==y[i]&&xx<=x[i]) S^=(<<i-);
}
return S;
}
int main()
{int i,j;
while (~scanf("%s",s[n]))
{
n++;
}
m=strlen(s[]);
for (i=;i<n;i++)
for (j=;j<m;j++)
{
if (s[i][j]=='X')
{
++cnt;
pd[cnt]=;
x[cnt]=i;y[cnt]=j;
}
else if (s[i][j]=='I')
{
++cnt;
pd[cnt]=;
x[cnt]=i;y[cnt]=j;
}
}
memset(dist,/,sizeof(dist));
Q.push((ZYYS){,,});
dist[][][]=;
while (Q.empty()==)
{
ZYYS u=Q.front();
Q.pop();
vis[u.x][u.y][u.s]=;
for (i=;i<;i++)
{
int x=u.x+dx[i],y=u.y+dy[i],S;
if (x<||y<||x>n||y>m) continue;
if (i==||i==)
S=get(u.s,u.x,min(y,u.y));
else S=u.s;
if (dist[x][y][S]>dist[u.x][u.y][u.s]+)
{
dist[x][y][S]=dist[u.x][u.y][u.s]+;
if (vis[x][y][S]==)
{
vis[x][y][S]=;
Q.push((ZYYS){x,y,S});
}
}
}
}
memset(ans,/,sizeof(ans));
inf=ans[];
for (i=;i<(<<cnt);i++)
{
tot=;
for (j=;j<=cnt;j++)
if ((i&(<<j-)))
{
if (pd[j]==)
{
tot=-;
break;
}
else
tot++;
}
if (tot!=-)
{
Max=max(tot,Max);
if (dist[][][i]<ans[tot]) ans[tot]=dist[][][i];
}
}
for (i=;i<=Max;i++)
printf("%d\n",ans[i]);
}
SRM340 VegetableGarden的更多相关文章
- topcoder srm 340 div1
problem1 link $f[i][L][R]$表示计算到第$i$个,最小最大值是$L,R$时的最少个数. import java.util.*; import java.math.*; impo ...
随机推荐
- 第2次作业:stream案例分析
摘要:本次随笔是对stream软件进行一次案例分析,以个人观点分析stream为什么成功. 一.介绍产品相关信息 1.我选择的商品是stream 2.选择该产品的主要原因准要是因为自己本身喜欢玩这个平 ...
- 20155306 2006-2007-2 《Java程序设计》第3周学习总结
20155306 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 4.1 类与对象 定义类 1.先在程序中定义类: Clothes{ Str ...
- 冲刺NO.12
Alpha冲刺第十二天 站立式会议 项目进展 项目核心功能,如学生基本信息管理模块,学生信用信息模块,奖惩事务管理模块等等都已完成,测试工作大体结束. 问题困难 项目结束后对项目的阶段性总结缺乏一定的 ...
- HTML5文件操作API
HTML5文件操作API 一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...
- java方法的定义格式
Java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段,声明格式为: [修饰符1 修饰符2 …..] 返回值类型 方法名( 形式参数列表 ){ Java 语句;… … … } 例如 ...
- vue 中获取select 的option的value 直接click?
我刚开始遇到这个问题的时候 直接用的click进行dom操作获取value 但是发现并灭有什么作用 问了旁边大神 才想起来还有change这个操作 于是乎 答案有了解决方案 1.在你的select中添 ...
- mui 页面无法下滑拖拽 主要体现在华为手机浏览器
项目做到中期遇到一个问题,华为手机有些页面显示不全且无法下滑. 因为之前一直用的Google浏览器的模拟模式进行开发和调试的,一直未发现这个问题. 刚开始 选用mui的下拉刷新上拉加载的方式来进行页面 ...
- python性能分析--cProfile
Python标准库中提供了三种用来分析程序性能的模块,分别是cProfile, profile和hotshot,另外还有一个辅助模块stats.这些模块提供了对Python程序的确定性分析功能,同时也 ...
- Angular 学习笔记 ( CDK - Layout )
简单说就是 js 的 media query. 1. BreakpointObserver const layoutChanges = this.breakpointObserver.observe ...
- Docker学习笔记 - Docker容器内部署redis
Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...