Description

Input

Output

一道坑爹的搜索……题意是可以往任意方向移动3格,或者如果旁边有格子的时候可以越过它移动,然后把它吃掉。要求吃到最后一个的位置在x0,y0

注意到可以越三格移动……所以取棋盘左上的3*3的格子,可以证明无论棋盘上何处的格子都可以通过一次3格的移动走到3*3的格子里

然后就可以用一个3*3的数组保存棋盘的状态,然后因为总的格子数小,还可以用10^9的数保存棋盘的状态(注意要算出3*3的九宫格中每一格最多放多少个,不然会wa)

然后就可以dfs搞之

再加个记忆化更快(注意每组数据都要重新hash)

#include<cstdio>
#include<cstring>
#define mod 1000007
const int mx[8]={0,0,-1,1,-1,1,-1,1};
const int my[8]={1,-1,0,0,1,-1,-1,1};
struct hashing{
int test,next;
bool ok;
}hash[1000010];
int head[mod];
int cnt,tox,toy;
int maxnum[4][4];
int a[4][4];
int K,N,M;
inline int find(int now)
{
int s=now%mod;
for (int i=head[s];i;i=hash[i].next)
if (hash[i].test==now)return hash[i].ok;
return -1;
}
inline void ins(int now,bool ok)
{
int s=now%mod;
hash[++cnt].test=now;
hash[cnt].ok=ok;
hash[cnt].next=head[s];
head[s]=cnt;
}
inline bool ok()
{
for(int i=1;i<=9;i++)
{
int ny=i%3;if (!ny)ny=3;int nx=(i-1)/3+1;
if (nx==tox&&ny==toy&&a[nx][ny]!=1)return 0;
if (nx!=tox||ny!=toy)if(a[nx][ny]!=0)return 0;
}
return 1;
}
inline bool dfs()
{
int now=0;
for (int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
now=now*10+a[i][j];
int fnd=find(now);if (fnd!=-1)return fnd;
for (int i=1;i<=3;i++)
for (int j=1;j<=3;j++)
if(a[i][j])
{
for(int k=0;k<8;k++)
{
bool mrx=0,mry=0;
int sx=i+mx[k];if (sx>3){sx-=3;mrx=1;}if (sx<1){sx+=3;mrx=1;}
int sy=j+my[k];if (sy>3){sy-=3;mry=1;}if (sy<1){sy+=3;mry=1;}
if (!a[sx][sy])continue;
if ((mrx||mry)&&a[i][j]==maxnum[i][j])continue;
int tx=i+2*mx[k];if (tx>3)tx-=3;if (tx<1)tx+=3;
int ty=j+2*my[k];if (ty>3)ty-=3;if (ty<1)ty+=3;
if (a[tx][ty]==maxnum[tx][ty])continue;
a[i][j]--;
a[sx][sy]--;
a[tx][ty]++;
if (dfs())
{
ins(now,1);
return 1;
}
a[i][j]++;
a[sx][sy]++;
a[tx][ty]--;
}
}
ins(now,0);
return 0;
}
int main()
{
freopen("galaxy.in","r",stdin);
freopen("galaxy.out","w",stdout);
while (scanf("%d%d%d%d%d",&K,&N,&M,&tox,&toy)!=EOF)
{
memset(hash,0,sizeof(hash));
memset(head,0,sizeof(head));
memset(a,0,sizeof(a));
cnt=0;
tox=(tox-1)%3+1;
toy=(toy-1)%3+1;
int now=0;
for (int i=1;i<=9;i++)
{
int xx=(i-1)/3+1;
int yy=(i-1)%3+1;
now*=10;
if (xx==tox&&yy==toy)now++;
}
ins(now,1);
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
maxnum[i][j]=(N/3)*(M/3)+(N%3>=i)*(M/3)+(M%3>=j)*(N/3)+(N%3>=i&&M%3>=j);
for (int i=1;i<=K;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x=(x-1)%3+1;
y=(y-1)%3+1;
a[x][y]++;
}
bool mrkres=0;
for (int i=1;i<=3;i++)
for (int j=1;j<=3;j++)
if (a[i][j]>maxnum[i][j])mrkres=1;
if (mrkres)
{
printf("No\n");
continue;
}
if (dfs())printf("Yes\n");
else printf("No\n");
}
}

  

bzoj2719[Violet 4]银河之星的更多相关文章

  1. 【BZOJ】2719 银河之星

    可以将棋子分为9种类型.且可以通过合并使得两个不同种类棋子转换为另一种棋子(不过要注意棋盘大小,有的时候硬要合并会到棋盘外面,可以先把棋盘全部转换,然后枚举每一个棋子的转换).然后把状态压成一个十位的 ...

  2. bzoj violet系列 (2708~2725)

    cbh大爷说:写博客不能弃坑. orz cbh 那我就来更新博客了. violet这个系列的题好神啊……出题人好劲啊…… ……怎么最近都在理性愉悦啊…… 另外bzoj400题纪念~ 2708: [Vi ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. NOIP2014-9-6模拟赛

    工资 (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可 ...

  5. NOI2002_ Galaxy银河英雄传说86

    NOI2002_ Galaxy银河英雄传说86     公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...

  6. XMU 1071 圣斗士黄金十二宫(七)银河星爆 【计算几何】

    1071: 圣斗士黄金十二宫(七)银河星爆 Time Limit: 500 MS  Memory Limit: 64 MBSubmit: 193  Solved: 10[Submit][Status] ...

  7. 3星|华杉华楠《超级符号原理》:超级符号是指注册为商标的企业logo

    “ 超级符号是私有财产,超级符号是通过对传统符号的改造,使之成为注册商标,成为私有化财产,通过占有它,让竞争对手无法使用.P112” 超级符号原理 作者: 华杉 华楠 出版社: 文汇出版社 出版年: ...

  8. 星浩资本快速发展引擎:IT就是生产力

    星浩资本成立于2010年,是一家涵盖私募基金.开发管理.商业与现代服务业三大业务范围的综合性管理公司,专注于投资中国首创.高成长性.高回报率的创新型城市综合体. 年轻的星浩资本在商业投资上有其独到的商 ...

  9. 读过MBA的CEO更自私?《哈佛商业评论》2016年第12期。4星

    老牌管理杂志.每期都值得精度.本期我还是给4星. 以下是本书中的一些内容的摘抄: 1:他们发现在Airbnb上,如果客人姓名听起来像黑人,那么比名字像白人的客人的接受率会低16%.#45 2:对立组织 ...

随机推荐

  1. 开源C/C++网络库比较

    在开源的C/C++网络库中, 常用的就那么几个, 在业界知名度最高的, 应该是ACE了, 不过是个重量级的大家伙, 轻量级的有libevent, libev, 还有 Boost的ASIO. ACE是一 ...

  2. FileMode枚举

    FileMode枚举是一个简单枚举,用于指定操作系统打开文件的方式. 枚举成员 成员值 描述 CreateNew 1 指定操作系统应创建新文件,如果文件存在则引发异常. Create 2 指定操作系统 ...

  3. C#安装程序制作让安装后的程序开机自动运行

    1.创建安装项目后要在自己的解决方案是添加一个新的类库项目(ClassLibrary1),并在新类库中添加一下安装程序类(Installer1),在Installer1类中添加如下代码: string ...

  4. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  5. Android APK安装包瘦身[转]

    很显然,APK安装包越小越好.下面从代码,资源文件,使用策略几个方面简要介绍下: 代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs. 使用proguard混淆 ...

  6. jQuery UI 之 LigerUI 快速入门

    LigerUI 快速开发UI框架 LigerUI 是基于jQuery 的UI框架,其核心设计目标是快速开发.使用简单.功能强大.轻量级.易扩展.简单而又强大,致力于快速打造Web前端界面解决方案,可以 ...

  7. C:\Program Files (x86)\Common Files\microsoft shared\TextTemplating\11.0

    Generating Files with the TextTransform Utility \Program Files\Common Files\Microsoft Shared\TextTem ...

  8. Pros and Cons of T4 in Visual Studio 2008

    Oleg Sych - » Pros and Cons of T4 in Visual Studio 2008 Pros and Cons of T4 in Visual Studio 2008 Po ...

  9. [Ext JS 4] 实战之多选下拉单 (带checkbox)

    前言 Ext js 创建一个多选下拉单的方式很简单, 使用Ext.form.ComboBox, 设置 multiSelect 为true 就可以了. 但是如果要在每个下拉之前加上一个checkbox, ...

  10. man/ls/clock/date/echo笔记

    login:    用户名:用户ID    认证机制:Authentication授权:Authorization审计:Audition (日志) prompt,命令提示符:命令:magic numb ...