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 ...
随机推荐
- 云计算--网络原理与应用--20171122--STP与HSRP
简单了解STP 学习HSRP 实验 一. 简单学习STP STP(spanning tree protocol)生成树协议,就是把一个环形的结构改变成一个树形的结构.通过一些算法,在逻辑上阻塞一些端 ...
- 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)
1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...
- 学号:201621123032 《Java程序设计》第13周学习总结
1:本周学习总结 2:为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 2.1:简述你想为你的系统增加什么网络功能?设计思路是什么? 创建了一个服务器监听8080端口,通过网络助手客户 ...
- 项目Beta冲刺Day7
项目进展 李明皇 今天解决的进度 部分数据传递和使用逻辑测试 林翔 今天解决的进度 服务器端查看个人发布的action,修改已发布消息状态的action,仍在尝试使用第三方云存储功能保存图片 孙敏铭 ...
- CNN中的padding
在使用TF搭建CNN的过程中,卷积的操作如下 convolution = tf.nn.conv2d(X, filters, strides=[1,2,2,1], padding="SAME& ...
- 从源码角度看LinkedList一些基本操作(jdk1.7)
介绍 LinkedList是一个双向链表,就像下图展示那样,每个节点有个指向上个元素和一个指向下个元素的指针. 接下来我会对我们经常使用的方法进行介绍,代码如下 @Test public void t ...
- 【TensorFlow随笔】关于一个矩阵与多个矩阵相乘的问题
问题描述: Specifically, I want to do matmul(A,B) where 'A' has shape (m,n) 'B' has shape (k,n,p) and t ...
- sql2008r2,以前好好可以用的,但装了vs2017后,连接不上了,服务也停了,结果手动也 启动不了, 无法加载或初始化请求的服务提供程
日志: 2017-12-14 12:33:17.53 服务器 A self-generated certificate was successfully loaded for encryption.2 ...
- EasyUI 中datagrid 分页。
注释:datagrid分页搞了好几天才完全搞好,网上没完全的资料.明天晚上贴代码. 睡觉.
- ORA-12514:TNS:lisntener does not currently know of service requested in connect descriptor
在使用工具连接oracle库的时候出现了异常 根据理解初步估计是服务或者监听器没有启动 于是链接到数据库服务器进行查看 服务都已经开启,重启后链接依旧出现上述问题 使用lsnrctl status ...