题意:

给出一个五子棋的棋面,问先手或者后手是否能够在三步之内必胜。

思路:

只有三次下子,我们可以枚举下的位置,分为以下三种情况:

①、先手在第一步就能获胜,说明棋面内有4子相连。

②、后手在第二步的时候获胜,说明棋面上后手有至少两个4子相连的情况。

③、先手在第三步的时候获胜,这时,先手在走第一步的时候,可能后手有一个4子相连,或者没有4子相连,如果有一个,那么先手就要去堵截,否则先手可以任意下子,接下来,后手走第二步,这时候我们就可以用②来判断先手是否必胜。

代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<climits>using namespace std;int a[20][20],nx,ny;
char b[][10]={"white","black"};int judge(int now)
{for(int i=0;i<15;i++)for(int j=0;j<15;j++){if(i<11&&j<11)if(a[i][j]==now&&a[i+1][j+1]==now&&a[i+2][j+2]==now&&a[i+3][j+3]==now&&a[i+4][j+4]==now)return 1;if(i<11)if(a[i][j]==now&&a[i+1][j]==now&&a[i+2][j]==now&&a[i+3][j]==now&&a[i+4][j]==now)return 1;if(j<11)if(a[i][j]==now&&a[i][j+1]==now&&a[i][j+2]==now&&a[i][j+3]==now&&a[i][j+4]==now)return 1;if(i>3&&j<11)if(a[i][j]==now&&a[i-1][j+1]==now&&a[i-2][j+2]==now&&a[i-3][j+3]==now&&a[i-4][j+4]==now)return 1;}return 0;
}int judge1(int now)
{int num=0,ok;for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=now;ok=judge(now);a[i][j]=-1;if(ok){nx=i;ny=j;return 1;}}return 0;
}int judge2(int now)
{int num=0,ok;for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=!now;ok=judge(!now);a[i][j]=-1;if(ok){num++;nx=i;ny=j;if(num==2)return num;}}return num;
}int judge3(int now)
{int ok;if(judge2(now)==1){int i=nx;int j=ny;a[i][j]=now;if(judge2(!now)==2){nx=i;ny=j;return 1;}elsereturn 0;}for(int i=0;i<15;i++)for(int j=0;j<15;j++)if(a[i][j]<0){a[i][j]=now;ok=judge2(!now);a[i][j]=-1;if(ok==2){nx=i;ny=j;return 1;}}    return 0;
}int main()
{int n;while(scanf("%d",&n)!=EOF){if(n==0)return 0;memset(a,-1,sizeof(a));int now=1;for(int i=0;i<n;i++){int x,y,k;scanf("%d%d%d",&x,&y,&k);if(k)now--;elsenow++;a[x][y]=k;}if(now!=0&&now!=1){printf("Invalid.\n");continue;}if(n<=5){printf("Cannot win in 3 moves.\n");continue;}if(judge1(now))printf("Place %s at (%d,%d) to win in 1 move.\n",b[now],nx,ny);else if(judge2(now)==2)printf("Lose in 2 moves.\n");else if(judge3(now))printf("Place %s at (%d,%d) to win in 3 moves.\n",b[now],nx,ny);elseprintf("Cannot win in 3 moves.\n");}return 0;
}

uvalive4836(枚举)相关推荐

  1. 【C#】枚举_结构体_数组

    最近看C#视频,关于这部分,先看了一遍,又照着敲了一遍,自己敲的过程发现了一些有意思的东西. 枚举:定义一个枚举类型的变量,这个变量有很多相同类型的值.比如性别Gender这个变量可以有男和女这两个值 ...

  2. Go 学习笔记(7)— 常量定义、常量使用、枚举用法、iota 常量、不设置初始值常量

    1. 常量定义及分类 1.1 定义 常量是指在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifie ...

  3. 1137 - Sin your life sin公式 + 枚举

    http://www.ifrog.cc/acm/problem/1137 和差化积公式, 变成2 * sin((x + y) / 2) * cos((x - y) / 2) + sin(n - (x ...

  4. C语言程序设计 细节总结(第9章 结构体共用体枚举)

    第9章 结构体.共用体.枚举 9.1 结构体 1.对于同类型结构体变量之间可以整体一次赋值 9.2 指向结构体的指针 9.2.1结构体变量的指针 1.定义格式:struct 结构体名 *结构体指针变量 ...

  5. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  6. c语言枚举3位数相加等于10,C语言 联合和枚举

    联合(union): 一.联合说明和联合变量定义 联合也是一种新的数据类型, 它是一种特殊形式的变量. 联合说明和联合变量定义与结构十分相似.其形式为: union 联合名 { 数据类型 成员名; 数 ...

  7. Codeforces Round #359 (Div. 2) C. Robbers' watch 暴力枚举

    题目链接 题意是真的烦,到最后才知道是n个m其实就是限定表的两个时区的位数,所以所当数不够填满时区的时候前边自动补零 思路:首先来说不能有重复的数字的话,小时和分钟的总位数大于7肯定不行. 7的7次方 ...

  8. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  9. HPU组队赛B:问题(二进制枚举)

    时间限制1 Second 内存限制 512 Mb 题目描述 你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集.比赛的问题集必须包含至少两个问题,而且比赛的总难度必 ...

最新文章

  1. C语言实现十大经典排序算法
  2. 子矩阵的最大累加和问题
  3. python 合并区间
  4. 我是一个内向的人,也是一个不善交际的人
  5. 修改xp boot.ini文件
  6. 计算机的英语谚语,英语谚语大全_2017考研:计算机专业考研复习要点_沪江英语...
  7. (26)FPGA编码器设计(第6天)
  8. 牛掰!某厂风控大佬整理的一套黑客学习思维导图及教程!
  9. 文本特征提取算法-TF-IDF
  10. 3dmax 注意事项
  11. 阿里云服务器防止ddos被攻击
  12. 批量提取网页中的超链接
  13. 2020.3-4 【读书笔记】
  14. 语言模型及RNN模型
  15. 基于c扩展框架php,深入Php底层,用c为php编写拓展
  16. 如何用java判断进程是否假死_Spring Boot假死诊断实战记录
  17. 新近起病的活动性RA患者中达标治疗与常规治疗的疗效比较:来自GUEPARD试验和ESPOIR队列的数据...
  18. docker-compose安装mongoDB详细步骤
  19. RocketMQ原理及解析
  20. 美国国家实验室列表(National Laboratory)

热门文章

  1. [省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发
  2. [scala-spark]2. Scala运行原理与源码查看
  3. TAdoquery的Filter
  4. JS判断页面控件是否可用
  5. 【路由交换实验】VLAN
  6. 【CyberSecurityLearning 37】网络安全常用Linux系统命令以及 源码包的安装过程
  7. cannot resolve symbol ‘R‘ 程序包R不存在
  8. 【宝,我去读书了。读的什么书,给你的情书】《数据结构(c++)邓俊晖》-绪论篇
  9. 堆排序(基于完全二叉树)
  10. 操作系统(三)操作系统的发展和分类