2018.10.25-dtoj-3989-五子棋(fir)

题目描述:

就像题目名字一样,他们在玩一种类似于五子棋的游戏,只是规则和五子棋有一些不同。 就像五子棋一样,ITer和Kitty依次在棋盘上放置棋子,ITer放置黑子,Kitty放置白子。与五子棋不同的是,当一种颜色的X个棋子组成一行或一列或一个对角线的时候(X不一定等于5),执该颜色的子的玩家胜利。

如图,当X=5时,ITer胜利的三种方法:

下了一会儿后,ITer和Kitty觉得无聊了。于是,他们又加了一个类似围棋的规则:当一个连通分量(四连通)的棋子的四周被另一种棋子围住时,这些棋子就消失了,我们称这些子被“吃掉”了。

如图,三颗白棋的四周都被黑棋围住,所以这三颗棋子就应该消失。成为下图:

现在ITer和Kitty下了N步棋,ITer先手,每次下棋的位置用坐标表示。 现在ITer想知道,下了N步棋后,是否有人赢了,在第几步赢了,是否有不合法的走法。

输入:

输入文件第一行两个正整数N,X,表示下了N步棋,当一种颜色的X个棋子组成一行或一列或一个对角线的时候,执该颜色的子的玩家胜利。 接下来的N行,每行2个正整数Xi,Yi,当i为奇数时,表示ITer在第 i步下在了(Xi,Yi)上,当i为偶数时,表示Kitty在第 i步下在了(Xi,Yi)上。

输出:

如果ITer在前N步赢了,则输出“ITer X”(中间用空格连接),X表示ITer在第几步赢了。 如果Kitty在前N步赢了,则输出“Kitty X”(中间用空格连接),X表示Kitty在第几步赢了。 如果在N步以内有不合法的步,则输出“illegal”。

一步不合法有以下几种情况:
1. 这步下在了已经有棋子的格子上。
2. 在没有吃掉对方棋子的情况下,该步子所在的联通分量的棋子被对方的棋子吃掉。如图1,白子走在了红叉的位置上是不合法的,因为这样会使该联通分量被吃掉。

如图2,如果白子走在红叉的位置上是合法的,因为它吃掉了右边的两个黑子。走完这步后白子不会消失,棋盘上的子变成图3。

请忽视某一个人赢了以后出现的不合法的步。 如果既没有出现不合法的步,又没有决出胜负,则输出“draw”。 假设棋盘是无限的。

数据范围:

Subtask 1 30%:N≤20,X≤5,Xi,Yi≤10。 Subtask 2 70%:N≤1000,X≤10,1≤Xi,Yi≤1000 。

题解:

模拟大好题。。。考验细节的码农题。

这里有神犇Jzy(orz)的博客已经讲得很清楚了

#include<bits/stdc++.h>
using namespace std;
#define in inline
#define re register
#define rep(i,a,b) for(re int i=a;i<=b;i++)
#define repd(i,a,b) for(re int i=a;i>=b;i--)
#define For(i,a,b) for(int i=a;i<b;i++)
#define _(d) while(d(isdigit(ch=getchar())))
template<class T>in void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
const int N=1004;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int a[N][N],cnt,n,k,C,id[N][N],mx,my;
bool vis[N];
bool J(int r,int x,int y,int col,bool is,int fl){/*if(r==9){printf("(%d , %d)\n",x,y);}*/vis[id[x][y]]=1;bool ff=0;For(i,0,4){int tx=x+dx[i],ty=y+dy[i];if((!a[tx][ty])||(is&&a[tx][ty]==3-col&&(!vis[id[tx][ty]])&&(!J(r,tx,ty,3-col,0,0)))) ff=1;}For(i,0,4){int tx=x+dx[i],ty=y+dy[i];if(a[tx][ty]==col){if((!vis[id[tx][ty]])&&J(r,tx,ty,col,is,ff|fl)) ff=1;}}if(ff) return true;if(!is&&!(fl|ff)) a[x][y]=0;return false;
}
in bool work(int r,int x,int y,int t1,int t2){int x1=0,x2=0;rep(i,0,k){if(a[x+i*t1][y+i*t2]==C) x1++;else break;}rep(i,0,k){if(a[x-i*t1][y-i*t2]==C) x2++;else break;}if(x1+x2-1>=k){if(C==1) printf("ITer %d\n",r);else printf("Kitty %d\n",r);return 0;}return 1;
}
int main(){
//  freopen("FIR.in","r",stdin);//freopen("FIR.out","w",stdout);g(n),g(k);C=2;rep(i,1,n){memset(vis,0,sizeof(vis));C=3-C; int x,y;g(x),g(y);id[x][y]=++cnt;if(a[x][y]){puts("illegal");system;return 0;}a[x][y]=C;memset(vis,0,sizeof(vis));//dfs(x,y,C,is);if(!J(i,x,y,C,1,0)) {puts("illegal");return 0;}mx=max(mx,x); my=max(my,y);/*rep(i,1,mx){rep(j,1,my) cout<<a[i][j]<<" ";cout<<endl;}cout<<"---"<<endl;*/rep(j,-1,1){rep(l,-1,1){if(!j&&!l) continue;if(!work(i,x,y,j,l)) return 0;}}}puts("draw");return 0;
}

DTOI 10.25 测试 T1 五子棋相关推荐

  1. 【2018/10/27测试T1】洛阳怀

    [题目] 传送门 [分析] 其实这道题似乎没有想象中的那么难 先说一下如何求 f(x)f(x)f(x) 吧,对 xxx 分解质因数,在这些质因数中,f(x)f(x)f(x) 就是好质数个数减去坏质数个 ...

  2. 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)

    使用单项循环链表实现字典操作(算法导论第十章10.2-5题) template<typename T> void insert(SingleCycleL<T> & l, ...

  3. 《中国人工智能学会通讯》——10.25 跨姿态和光照变化的低分辨率人脸识别

    10.25 跨姿态和光照变化的低分辨率人脸识别 为了解决安全问题,监控的使用逐渐增多,这使得人们对完全自动并具有鲁棒性的人脸识别系统的要求也随之增大.通过监控获得的图片通常分辨率较低且姿态和光照条件不 ...

  4. lol12月25服务器维护,lol12月10日维护到几点 英雄联盟12月10日10.25版本更新维护时间...

    lol12月10日维护到几点?2020年12月10日英雄联盟全区停机维护更新10.25版本的内容,大家需要等待至维护结束才能登录游戏体验新版本.不知道本次更新时长的玩家,下面小编带来了英雄联盟12月1 ...

  5. Interview:算法岗位面试—10.25早上—上海某电公司算法岗位(偏图像算法,国企)技术面试之比赛历程、项目收获(Pytorch和Tensorflow)、未来方向

    Interview:算法岗位面试-10.25早上-上海某电公司算法岗位(偏图像算法,国企)技术面试之比赛历程.项目收获(Pytorch和Tensorflow).未来方向 导读:10.25早上一位博士技 ...

  6. 电子商务基础课件(10.25更新)

    电子商务基础课件(10.25更新) 电子商务基础课件 unit01-01-1.rar unit01-01-2.rar unit03-01.rar unit04-01.rar unit05-01.rar ...

  7. Java黑皮书课后题第10章:**10.25(新的字符串split方法)String类中的split方法会返回一个字符串数组,该数组是由分隔符分隔开的子串构成的

    Java黑皮书课后题第10章:**10.25(新的字符串split方法) 题目 代码 运行实例 题目 代码 public class Test25 {public static String[] sp ...

  8. Python 经典模块可能都学过,10道题测试你会不会用?

    Python 作为 2021 年度最受欢迎的编程语言,备受众人瞩目,也很受新手小白喜爱.除此之外,它在很多领域都发挥其作用,比如大数据.无人驾驶.Web 开发等等. [敲重点] 蓝桥云课即将在 202 ...

  9. hdu 2069 1 5 10 25 50 这几种硬币 一共100个(母函数)

    题意: 有50 25 10 5 1 的硬币 一共最多有100枚 输入n输出有多少种表示方法 Sample Input 11 26 Sample Output 4 13 1 # include < ...

最新文章

  1. SVD与PCA的区别
  2. kill -9 进程杀不掉,怎么办?
  3. 绕开bug的feed_dict,用自己的数据集训练DCGAN
  4. tableau必知必会之学做时尚的环状条形图(跑道图)
  5. Android——按钮的事件监听
  6. Windows下Python包和模块的安装方法(亲测手动安装)
  7. 研究僵局–第4部分:修复代码
  8. python标签使用教程_怎样用Python做标签云
  9. 避坑!使用 Kubernetes 最易犯的 10 个错误
  10. Java 反射(练习)
  11. 还在用Random获取随机数?ThreadLocalRandom 性能更佳!
  12. 用ado.net取数据库中table、column的信息
  13. Python pip windows安装
  14. hashmap允许null键和值吗_【29期】Java集合框架 10 连问,你有被问过吗?
  15. excel题库做成刷题得html,实例教你制作简易的Excel出题库,送给在一直忙碌的你!...
  16. 计算机文件夹中看不到桌面图标,电脑文件夹内不显示图标
  17. 西瓜创客和核桃编程之间,哪个更靠谱?西瓜创客一年学费多少?
  18. BLE协议栈学习2——OSAL
  19. LLVM WEEKLY系列停止转载
  20. 2022 年顶级商业和 IT 认证课程,让你获得职业信誉,提升竞争力

热门文章

  1. 《css+html小案例3》小米商城手机部分:利用浮动+弹性盒子布局
  2. 常用传感器讲解三--心率传感器-KY-039(heartbeat)
  3. 漂洋过海来看你 老歌
  4. 前端面试每日3+1(周汇总2019.06.16)
  5. Linux定时任务每10分钟运行一次
  6. php防作弊在线考试系统,在线考试系统如何实现防作弊?
  7. ios 调用系统相机为英文时的更改
  8. Python使用Turtle画奥兰群岛旗帜
  9. 跳槽:三年五年一个坎
  10. html点击隐藏divjq,jquery点击a标签怎么显示和隐藏div?详解