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的更多相关文章

  1. topcoder srm 340 div1

    problem1 link $f[i][L][R]$表示计算到第$i$个,最小最大值是$L,R$时的最少个数. import java.util.*; import java.math.*; impo ...

随机推荐

  1. JavaScript(第二十九天)【js处理XML】

    随着互联网的发展,Web应用程序的丰富,开发人员越来越希望能够使用客户端来操作XML技术.而XML技术一度成为存储和传输结构化数据的标准.所以,本章就详细探讨一下JavaScript中使用XML的技术 ...

  2. alpha-咸鱼冲刺day3-紫仪

    总汇链接 一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 今天把数据库的表给建好了,学长那边把登陆跟注册页面也做好了(纯页面,html5+css的那种) 四,问题困难   日常 ...

  3. python实现京东秒杀

    # _*_coding:utf-8_*_ from selenium import webdriver import datetime import time driver = webdriver.C ...

  4. Python 双向链表

    操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历链表 add(item) 链表头部添加 append(item) 链表尾部添加 insert(pos, it ...

  5. Syabse数据库无法启动的解决方案

    在探讨本问题之前,首先要为大家解释一下Syabse数据库本身.Syabse数据库应用和本身的架构相对而言都相对比较复杂,多数技术人员及公司对Sybase数据库底层结构和运行机制也处于并非完全了解的阶段 ...

  6. Linux系统把/home重新挂载到其他硬盘或分区

    一开始没有做好规划,导致/home空间不足,再加上分区表不是GPT,导致无法扩展超过2T,因此需要重新划分一块更大的硬盘给/home. 1.把新挂载的4T硬盘进行分区和格式化 2.创建目录 sudo ...

  7. sass的简介,安装,语法。

    一,sass的简介 1,Sass完全兼容所有版本的CSS.我们对此严格把控,所以你可以无缝地使用任何可用的CSS库. 2,Sass已经经过其核心团队超过8年的精心打造. 3,有无数的框架使用Sass构 ...

  8. mysql批量插入语句执行失败的话,是部分失败还是全部失败

    项目开发中,正好遇到这个问题. 将一批从外部第三方接口获取到的数据存储到本地mysql数据库,假设接口返回的数据类型为A,经过A到B的转换规则转换后, 要插入数据库的数据类型为B.那么在A获取到100 ...

  9. [Luogu1342] 请柬 - 最短路模板

    Description 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被 ...

  10. Hibernate(十一):映射继承关系的三种方案

    背景: 在一些项目中,会采用集成的关系来定义数据库实体类,比如:人(Person)与学生(Student),学生来源与人,所以人的基本属性学生也拥有:但学生有的一些属性,人就不具有.人与学生之间很显然 ...