Description

Link.

  • 游戏在 \(4\times4\) 的菱形棋盘上进行;

  • 两名玩家轮流放置弹珠,可以在横向、纵向、\(45\) 度斜线、\(135\) 度斜线方向未放置弹珠的位置连续放置 \(1\) 至 \(3\) 颗弹珠,玩家在可以放置弹珠的情况下,必须至少放置 \(1\) 颗弹珠。

  • 如果某位玩家无法再继续放置弹珠,则该名玩家输掉游戏,另外一名玩家获胜。

Solution

虽然是套路,但毕竟是之前没做过的套路,写篇题解记一下。

首先我们可以直接考虑状压,棋盘编号见图:

然后你打个表出来,表示所有能走的情况(状压),比如我要放棋子在 \(1-5-9\) 上面,就是 \((100010001)_{2}\)。

因为是用 C++ 输出的形式手打的 \(82\) 种情况表,所以 generator 就不附了。

然后你打个 DP,设 \(f_{S}\) 为当前棋盘状态为 \(S\)(\(S\) 的第 \(i\) 为 \(1\) 表示这个格子被占据,反之亦然)是先手必胜还是先手必输或者不知道(分别对应数字 \(1/0/-1\))。

初始状态为 \(\forall i\in[0,2^{n}-1),f_{i}=-1\);\(f_{2^{n}-1}=0\)。

然后你记搜一下,把所有状态搜出来。

然后就回答询问即可,只是不太清楚为什么要搞这么多字符读入卡 IO,明明多不多组都一样。

#include<bits/stdc++.h>
using namespace std;
int t,n=7,m[8]={1,2,3,4,3,2,1},id,f[(1<<16)+10];
char s[10];
const int upper=(1<<16);
const int ID[10][10]={{0},{4,1},{8,5,2},{12,9,6,3},{13,10,7},{14,11},{15}};
const int walking[90]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,17,3,18,272,48,34,6,288,36,4352,768,544,96,68,12,4608,576,72,12288,8704,1536,1088,192,9216,1152,24576,17408,3072,2176,18432,49152,34816,33,528,66,8448,1056,132,16896,2112,33792,136,273,7,1057,4368,16912,112,546,2114,14,292,1792,8736,224,33824,1092,4672,584,28672,3584,17472,2184,9344,57344,34944};
inline int unionset(int x,int y){return x|y;}
inline int intersection(int x,int y){return x&y;}
inline bool emptyset(int x){return x==0;}
void dfs(int board)
{
if(~f[board]) return;
for(int i=0;i<82;++i)
{
if(emptyset(intersection(board,walking[i])))
{
int newset=unionset(board,walking[i]);
dfs(newset);
if(f[newset]==0)
{
f[board]=1;
return;
}
}
}
f[board]=0;
}
inline char fgc()
{
static char buf[1<<17],*p=buf,*q=buf;
return p==q&&(q=buf+fread(p=buf,1,1<<17,stdin),p==q)?EOF:*p++;
}
inline char fgop()
{
char res=0;
while((res^'*')&&(res^'.')) res=fgc();
return res;
}
inline void read(int &x)
{
x=0;
char c=fgc();
while(isdigit(c)==0) c=fgc();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^'0'),c=fgc();
}
int main()
{
read(t);
memset(f,-1,sizeof(f));
f[upper-1]=0;
for(int i=0;i^upper;++i)
{
if(f[i]==-1) dfs(i);
}
while(t--)
{
int board=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<m[i];++j) board+=(fgop()=='*')?(1<<ID[i][j]):0;
}
printf(f[board]?"Possible.":"Impossible.");
printf("\n");
}
return 0;
}

Solution -「洛谷 P7395」「CoE-I 2021C」弹珠游戏的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. 「 洛谷 」P2768 珍珠项链

    珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...

  3. 「 洛谷 」P4539 [SCOI2006]zh_tree

    小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...

  4. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  5. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  6. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  7. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  8. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  9. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  10. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. NOIP2021游记

    前言: 今年我是以初中生的身份参加的 NOIP,不计奖,不排名,就去试试水. 考得也不好,幸好没计奖. 正文: 早上 7 点: 到LNBS,在旁边吃了早饭,很好吃. 早上 8 点: 校门口照相,然后进 ...

  2. Python Excel 操作 | xlrd+xlwt 模块笔记

    Python 的pandas模块使用xlrd作为读取 excel 文件的默认引擎.但是,xlrd在其最新版本(从 2.0.1 版本开始)中删除了对 xls 文件以外的任何文件的支持. xlsx fil ...

  3. JeeCms低代码开发平台了解及认知以及遇到的问题

    1.jeecms低代码开发平台自带标签,使用的标签延续freemarker标签或基于freemarker标签自定的标签(类似自jsp自定义标签) (1)什么是freemarker标签: FreeMar ...

  4. 一篇文章带你入门HBase

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 目录 HBase特性 Hadoop的限制 基本概念 NameSpace Table RowKey Column Time ...

  5. Typora 主题Mo Dark 样式

    Mo Dark 主题样式 html { font-size: 16px; } /*加粗字体样式*/ strong { -webkit-background-clip: text; -webkit-te ...

  6. https 原理分析进阶-模拟https通信过程

    大家好,我是蓝胖子,之前出过一篇https的原理分析 ,完整的介绍了https概念以及通信过程,今天我们就来比较完整的模拟实现https通信的过程,通过这篇文章,你能了解到https核心的概念以及原理 ...

  7. 从头学Java17-Lambda表达式

    Lambda表达式 这一系列教程,旨在介绍 lambda 的概念,同时逐步教授如何在实践中使用它们. 回顾表达式.语句 表达式 表达式由变量.运算符和方法调用组成,其计算结果为单个值.您已经看到了表达 ...

  8. 【SpringBoot】整合Redis

    1.前言 最近公司在做项目,用到了redis,,发现自己一点都不会,然后就乘闲暇时间,自己学习一些redis相关的知识,在这里分享给像我一样的初学者. 2.我的项目结构: 2.1 pom.xml &l ...

  9. Spring Cloud 之OpenFeign

    Spring Cloud 之OpenFeign 一:简介 ​ Feign是一个声明式(对比RestTemplate编程式)的服务客户端,即通过@FeignClient注解即可声明一个接口(interf ...

  10. Word书签替换,加盖电子印章及转换PDF(Java实用版)

    一.前言 在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:https://ww ...