Description

描述

Alice 对弹珠游戏已经有些厌烦了,她经常在电脑上玩这个游戏。她之所以感到厌烦是因为在这个游戏上她已经是专家级别,她总是能够和电脑打成平手。
Alice 创造了一款新的电脑游戏。以下是这款两人电脑游戏的规则:

(1)游戏在如下图所示的菱形棋盘上进行;

(2)两名玩家轮流放置弹珠,可以在横向、纵向、4545 度斜线、135135 度斜线方向未放置弹珠的位置连续放置 11 至 33 颗弹珠,玩家在可以放置弹珠的情况下,必须至少放置 11 颗弹珠。以下是合法的单次放置操作的示例(黑色圆点表示放置了弹珠,白色圆点表示未放置弹珠,进行该次操作前棋盘为空):

以下是非法的单次放置操作的示例(黑色圆点表示放置了弹珠,白色圆点表示未放置弹珠,进行该次操作前棋盘为空):

图片来源:代理游戏http://www.walajiao.com/代理游戏

非法原因的解释:(aa)三颗弹珠不在同一条斜线(或者垂直线)上;(bb)两颗弹珠之间相隔一个空位;(cc)三颗弹珠不在同一条斜线上;(dd)三颗弹珠不在同一条斜线(或者垂直线)上;(ee)一次性放置了 44 颗弹珠;(ff)三颗弹珠不在同一条水平线(或者垂直线、或者斜线)上。

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

Alice 总是第一个进行游戏,而且经常是和 Bob 玩这个游戏,Bob 在进行若干游戏操作后可能会离开,将游戏交由电脑代理,电脑总是按照最优策略放置弹珠。 给定Bob 离开后的游戏状态,你的任务是确定 Alice 是否可能在对阵电脑时获得胜利。

输入格式
输入包含多组测试数据。

输入第一行包含一个整数 TT,表示测试数据的组数。接着是一个空行。再接下来是 TT 组表示棋盘状态的数据,每组数据由七行字符构成,表示 Bob 离开后的游戏状态,* 表示该位置已经放置了弹珠,. 表示该位置未放置弹珠。相邻两组测试数据之间有一个空行。

输出格式
对于每组测试数据,如果 \operatorname{Alice}Alice 能够获胜,输出 Possible.,否则输出 Impossible.。

输入输出样例

输入 #1

6** ** * *
* * * *. * *. *.** ** * *
. . . ** * ** **** ** * .
* * * ** * .* **** *. . *
* * * ** * ** **.* ** * *
* * * .* * ** **.* .* * .
* * * .* * ** **

输出#1

Possible.
Possible.
Possible.
Possible.
Impossible.
Possible.

说明/提示

样例说明
第一组数据,Alice 可以选择在棋盘左下角的斜线方向所剩下的 33 个空余位置一次性连续放置 33 颗弹珠,使得后续电脑无法再放置弹珠,因此 Alice 能够获胜。

第二组数据,Alice 可以选择沿着第四行剩下的 33 个空余位置一次性连续放置 33 颗弹珠,使得后续电脑无法再放置弹珠,因此Alice 能够获胜。

第三组数据,棋盘剩下倒数第二列两个连续的空余位置,Alice 可以一次放置 22 颗弹珠,使得后续电脑无法放置弹珠,因此Alice 会获胜。

第四组数据,类似于第二组测试数据,棋盘剩下第三行两个连续的空余位置,因此 Alice 会获胜。

第五组数据,棋盘只剩下两个不连续的空余位置,由于 Alice 一次只能选择一个空余位置放置 11 颗弹珠,因此不管Alice 如何操作,电脑总能一次性将剩下的棋盘使用弹珠填满,使得 Alice 无法再继续放置弹珠,因此Alice 会输掉比赛。

第六组数据,Alice 可以选择在棋盘右上角斜线方向的中间两个空余位置放置 22 颗弹珠,使得棋盘状态转化为样例输入的第五组数据,因此Alice 会赢得比赛。

正片开始

  • 游戏在 4×4 的菱形棋盘上进行;
  • 两名玩家轮流放置弹珠,可以在横向、纵向、45 度斜线、135 度斜线方向未放置弹珠的位置连续放置 1 至 3
    颗弹珠,玩家在可以放置弹珠的情况下,必须至少放置 1 颗弹珠。
  • 如果某位玩家无法再继续放置弹珠,则该名玩家输掉游戏,另外一名玩家获胜。

Solution

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

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

图片来源:代理游戏http://www.walajiao.com/代理游戏

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

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

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

初始状态为 ∀i∈[0,2n−1),fi=−1;f2n−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;
}

P7395 弹珠游戏(2021 CoE-I C)相关推荐

  1. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

  2. 《Arduino开发实战指南:LabVIEW卷》6.6 基于Arduino的弹珠游戏

    6.6 基于Arduino的弹珠游戏 6.6.1 实现的功能 本节将使用LabVIEW及Arduino设计实现一个简单的弹珠游戏.该弹珠游戏规则为,左右移动挡板,使弹珠在矩形区域内运动而不掉落到矩形区 ...

  3. PyGame弹珠游戏双人改良版

    # _*_ coding:utf-8 _*_ import pygame from pygame.locals import * from sys import exit__author__ = 'a ...

  4. 使用Scratch制作项目《弹珠游戏》

    不知道大家有没有听说过这样一句话,"80后玩弹珠,90后玩游戏,00后怎么消遣业余时间?不是王者就是吃鸡." 作为一名90后,我们对打弹珠在熟悉不过了,今天,我们就来了解以下如果使 ...

  5. ZZULIOJ 1790 弹珠游戏

    1790: 弹珠游戏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 25  Solved: 20 SubmitStatusWeb Board Desc ...

  6. 【深度优先搜索】弹珠游戏

    LCP 63. 弹珠游戏 题意:从边界(不包含四个角)射入弹珠,遇到W或E转向,终点为'O',最多走num步,问所有符合题意的起点. int dfs(x,y,d):从x,y走到'O',沿方向d,走的步 ...

  7. unity弹珠游戏-虚拟现实期末大作业(附下载链接)

    unity弹珠游戏 Unity版本 2020.2.22 unity期末大作业,就是发射弹珠,相同的几个碰到一起会消失,游戏开始有游戏说明界面,点击开始进入游戏 游戏详情如下动态图所示: https:/ ...

  8. LCCUP第三题弹珠游戏总结,附完整代码

    LCCUP第三题弹珠游戏总结,附完整代码 if语句非必要不要将条件分段写,分段写可能会导致出现某些特殊情况时,代码出现莫名bug(这题我因为分段写导致dfs函数中途退出从而漏掉了某些结果) 写伪代码时 ...

  9. P2356 弹珠游戏题解

    P2356 弹珠游戏题解 先说都会的TIE两个点的题解- #include<bits/stdc++.h> using namespace std; int n; int a[10001][ ...

最新文章

  1. layer.js 弹窗组件API文档
  2. C#的简单不安全双向“混淆”
  3. Knox网关、网关简介、概述、支持的Apache Hadoop服务、支持的Apache Hadoop生态系统的UI、参考资料
  4. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...
  5. python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
  6. android开源2016_开源多样性努力在2016年获得动力
  7. VMware虚拟机中ubuntu的磁盘怎么扩容
  8. C#4.0 可选参数和命名参数
  9. P3007 [USACO11JAN]大陆议会The Continental Cowngress(2-SAT)
  10. 编程之美--高效率算出1的数目之扩展问题
  11. java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧
  12. win7系统未响应卡住_win7系统文件夹出现假死及未响应的解决方法
  13. 可爱的猫咪怎么画?超详细教你如何绘画可爱的猫咪!
  14. css实现图片毛玻璃效果
  15. 让你收入翻倍,做自媒体不会写文案?用这3款文案自动生成工具
  16. 通往古埃及文明的钥匙 ———— 罗塞塔石碑
  17. Polyanskiy’s bound
  18. JavaCV - 调整图像饱和度
  19. 无代码开发工具推荐丨三叠云
  20. asp毕业设计——基于asp+access的学生管理系统设计与实现(毕业论文+程序源码)——学生管理系统

热门文章

  1. -tomcat的介绍
  2. vb.net程序可以在触摸屏上运行么_【干货】触摸屏控制变频器的方法与步骤
  3. DataFrame.drop_duplicates操作中的inplace参数
  4. OpenGL播放yuv数据流(着色器SHADER)-windows(一)
  5. 多元线性回归推导过程
  6. java学籍管理信息系统模板_java学籍管理系统051
  7. mysql select @x_mysql中select * for update
  8. SqlSession was not registered for synchronization because synchronization is not active
  9. 2021年Java工程师飞升成神之路
  10. 全志A64平台 TP9950 BT656输入驱动调试(1)环境搭建驱动编写