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 ...
随机推荐
- 『开源』设置系统 主音量(0~100 静音) VolumeHelper 兼容 Xp Win7 .Net 20 AnyCPU
背景: 近来的生活一团乱麻,没心态写高大上的代码,于是就着手 写了几个 辅助类. 在整理 InkFx.Utils 时,发现有几个 辅助类 只写了定义,没有实现函数体,于是就 花了1天时间 完善了一下. ...
- eclipse配置svn方法
一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...
- segmentedControl设置字体和字体颜色问题
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor],UITextAttributeT ...
- linux 下 /bin /sbin 的区别
/bin,/sbin,/usr/bin,/usr/sbin区别 / : this is root directory root 用户根目录 /bin : command ...
- wordpress怎么禁止文章复制
登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...
- spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互
spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...
- Linux实战案例(4)CentOS清除用户登录记录和命令历史方法
CentOS清除用户登录记录和命令历史方法 清除登陆系统成功的记录[root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信 ...
- System Rules 更好的测试
1:编写测试事例时候,我们要从控制台拿到数据与断言进行对比,通常要编写jdk 标准输出的屏蔽控制器.文章标题的包,能够更好的为我们进行工作. package demo2; import static ...
- RxJava系列1(简介)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- log4j将日志文件输出到相对路径
建议直接使用jvm中定义的变量或者操作系统的环境变量. log4j.appender.logfile.File=${user.dir}/logs/app.log,使用tomcat容器时${user.d ...