题目链接:https://codeforces.com/gym/101667/attachments

题意:有一个4∗44*44∗4的棋盘下三子棋,下棋规则是黑白两方轮流选择某一列,在这一列按行从小到大开始找,找到第一个没有被占据的位置然后将棋子放下,当出现三子连环的时候棋局结束。现在已知黑棋先手,并且知道第一手下在了第xxx列。问当白棋下在(a,b)(a,b)(a,b)位置并且这个时候胜利的情况有多少种满足要求的棋局。

解题心得:因为棋局很小并且限制条件题目中也给出了可以直接暴力搜索主要注意一下判断是否胜利的三子连环的情况。


#include <bits/stdc++.h>using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef unsigned long long ull;
int maps[10][10], a, b, x, r[10];
set<ull> se;bool checke(int x, int y, int c)//判断当前棋子颜色为c下在(x,y)位置是否胜利
{if(x - 1 >= 1 && x + 1 <= 4){if(maps[x - 1][y] == c && maps[x + 1][y] == c) return false;}if(y - 1 >= 1 && y + 1 <= 4){if(maps[x][y - 1] == c && maps[x][y + 1] == c) return false;}if(x - 1 >= 1 && y + 1 <= 4 && x + 1 <= 4 && y - 1 >= 1){if(maps[x - 1][y + 1] == c && maps[x + 1][y - 1] == c) return false;}if(x - 1 >= 1 && y - 1 >= 1 && x + 1 <= 4 && y + 1 <= 4){if(maps[x - 1][y - 1] == c && maps[x + 1][y + 1] == c) return false;}if(x - 2 >= 1){if(maps[x - 1][y] == c && maps[x - 2][y] == c) return false;}if(x + 2 <= 4){if(maps[x + 1][y] == c && maps[x + 2][y] == c) return false;}if(y - 2 >= 1){if(maps[x][y - 1] == c && maps[x][y - 2] == c) return false;}if(y + 2 <= 4){if(maps[x][y + 1] == c && maps[x][y + 2] == c) return false;}if(x - 2 >= 1 && y + 2 <= 4){if(maps[x - 1][y + 1] == c && maps[x - 2][y + 2] == c) return false;}if(x - 2 >= 1 && y - 2 >= 1){if(maps[x - 1][y - 1] == c && maps[x - 2][y - 2] == c) return false;}if(x + 2 <= 4 && y - 2 >= 1){if(maps[x + 1][y - 1] == c && maps[x + 2][y - 2] == c) return false;}if(x + 2 <= 4 && y + 2 <= 4){if(maps[x + 1][y + 1] == c && maps[x + 2][y + 2] == c) return false;}return true;
}ull Hash() {//将棋局hash存储去重ull sum = 1;for(int i=1;i<=4;i++) {for(int j=1;j<=4;j++) {ull va = maps[i][j];if(va == -1) va = 2333;sum = sum*233 + va;}}return sum;
}void dfs(int r1, int r2, int r3, int r4, int w)//暴力搜索,分别记录每一列已将放下的棋子数以及当前棋子的颜色
{if((r1 == a && b == 1) || (r2 == a && b == 2) || (r3 == a && b == 3) || (r4 == a && b == 4)) return ;if(r1 > 4 || r2 > 4 || r3 > 4 || r4 > 4) return;if(checke(r1 + 1, 1,w)){maps[r1 + 1][1] = w;dfs(r1 + 1, r2, r3, r4, !w);maps[r1 + 1][1] = -1;} else{if(r1 + 1 == a && 1 == b && w == 1){se.insert(Hash());}}if(checke(r2 + 1, 2, w)){maps[r2 + 1][2] = w;dfs(r1, r2 + 1, r3, r4, !w);maps[r2 + 1][2] = -1;} else {if(r2 + 1 == a && 2 == b && w == 1){se.insert(Hash());}}if(checke(r3 + 1, 3, w )){maps[r3 + 1][3] = w;dfs(r1, r2, r3 + 1, r4, !w);maps[r3 + 1][3] = -1;} else {if(r3 + 1 == a && 3 == b && w == 1){se.insert(Hash());}}if(checke(r4 + 1, 4, w)){maps[r4 + 1][4] = w;dfs(r1, r2, r3, r4 + 1, !w);maps[r4 + 1][4] = -1;} else {if(r4 + 1 == a && 4 == b && w == 1){se.insert(Hash());}}
}int main()
{scanf("%d%d%d", &x, &a, &b);memset(maps, -1, sizeof maps);maps[1][x] = 0;r[x]++;dfs(r[1], r[2], r[3], r[4], 1);printf("%d\n", int(se.size()));return 0;
}

2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667B相关推荐

  1. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667C

    题目链接:https://codeforces.com/gym/101667/attachments 题意:现在有一个无向图,一个人要可以随便找一个起点然后选择一条路径去旅游,要求路径从起点开始之后每 ...

  2. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667K

    题目链接:https://codeforces.com/gym/101667/attachments 题意:现在让你从原点开始走,每次给你转向的方向你需要安排每一次转向要走多远并且让整个路径没有交点. ...

  3. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667L

    题目链接:https://codeforces.com/gym/101667/attachments 题意:有ppp个人,他们各自在不同的图里面,每个图都有一个终点,现在他们都需要从111点同时到达终 ...

  4. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  5. 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...

  6. 2018 ICPC Asia Jakarta Regional Contest

    2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...

  7. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  8. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

    2017-2018 ACM-ICPC, Asia Daejeon Regional Contest 题号 题目 难度 知识点 A Broadcast Stations B Connect3 C Gam ...

  9. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest (大部分题解)

    2017-2018 ACM-ICPC, Asia Daejeon Regional Contest ECFINAL PK赛. C 签到题. DAG上的dp. D 签到题. 根据数据范围可知暴力即可. ...

最新文章

  1. 教你如何解决Python模块导包没有找到的问题
  2. 【自用】 sklearn 用 train_test_split 简单划分训练和测试集
  3. Hard Calculation 模拟(200)
  4. java itextsharp_使用 c#中的 itextsharp 以 pdf 格式填充 xml
  5. 【转载】优酷网首席执行官兼创始人古永锵演讲
  6. 提交spark的bug的地方
  7. BZOJ 4066 简单题 ——KD-Tree套替罪羊树
  8. 「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)
  9. bzoj 2435: [Noi2011]道路修建(DFS)
  10. response.contenttype
  11. 实现一个 Java 版的 Redis (1)----百行代码解析Redis 协议.
  12. 面向对象16:代码块、final关键字
  13. mac启动rabbitmq_从0到1学习Flink—— Flink 读取 Kafka 数据写入到 RabbitMQ
  14. windows实用软件
  15. 城市供水调度平台(Axure高保真原型)
  16. C语言基础视频教程 15天
  17. 内存映射(Memory Map)
  18. 在移动硬盘(U盘)上安装最新版Windows11+PE双系统m.2硬盘选购
  19. Allegro对不规则outline处理
  20. 统计学 假设检验(Hypothesis Testing)

热门文章

  1. AirFlow_使用
  2. 【luogu 3868】中国剩余定理模板题
  3. Java设计模式面试题(一)
  4. java学习(类和对象)
  5. 电子表格是计算机几级,计算机一级电子表格文档.doc
  6. 关于企业上云,我们想跟你聊聊!|中机智库
  7. 视频捕捉全教程(vc+vfw)
  8. Application Loader上传app,一直卡在“正在通过 App Store 进行鉴定”
  9. mysql alter auto increment_修改mysql中Auto_increment值的例子
  10. Java减肥高手Xtend 捆绑Eclipse IDE