当前位置: 首页 > news >正文

(AC)五子棋

题目描述

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

五子连珠是在横线,纵线,斜线,反斜线四个方向上形成五子及以上的连线,当出现多于五子的连珠时,也只记为一次五子连珠。

五子连珠总数等于棋局中的所有方向上的五子连珠连线的数量之和。

我们想知道,给定一个长宽皆为n的棋局,白棋落在哪些点可以增加白棋五子连珠总数?

对增加白棋五子连珠总数的举例说明 (A点为我们选择的落点):
1
wwwwAbbbb
落白棋之前未形成五子连珠,落入白棋之后,五子连珠总数加一,满足要求。
2
wwwwwAbbbb
落白棋之前已经形成五子连珠,落白棋之后,五子连珠总数不变,不满足要求。
3
wwwwwAwwwww
落白棋之前五子连珠总数为二,落入白棋之后,两边连成一线,五子连珠总数减一,不满足要求。
4
*w***w88888
**w**w*****
***w*w*****
****ww*****
wwwwwAwwwww
落白棋之前五子连珠总数为二。落入白棋之后,两边连成一线,斜向和纵向形成新的五子连珠,总数为三。五子连珠总数加一,这个点满足要求。

输入

输入为第一行为一个数字n(n≤40),表示棋盘大小。
接下来的n行,每行为n个字符,可能有三种字符,* 表示无棋子,b 表示黑棋,w 表示白棋。

输入棋局中可能已经有五子连珠的情况,我们需要计算能增加白棋五子连珠总数的白棋落点。

输出

输出为k行,包括k个满足要求的落点,k个点按照从左至右,从上至下的顺序输出,即先按行排序,再按列排序输出。
每行为一个点坐标y,x,分别表示列坐标,行坐标,以空格分隔,坐标序号从0开始,棋盘左上角为原点。
*a***
*****
*****
*****
***b*

图中a点的坐标为1 0 ,b 点的坐标为 3 4 。

样例输入

复制

8
****b*bb
*****b*b
bb*bbbw*
w*wbwwww
bwwbwwbw
ww**wbbw
*bww***w
***bwb*b
样例输出

复制

7 2
2 5
3 5
4 6
2 7

一个注释折磨我两小时 

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int n;
char chess[45][45];int check(){int ans=0;int t;for(int i=0;i<n;++i){t=0;for(int j=0;j<n;++j){if(chess[i][j]!='w'){if(t>=5)ans++;t=0;}else t++;}if(t>=5)ans++;}for(int j=0;j<n;++j){t=0;for(int i=0;i<n;++i){if(chess[i][j]!='w'){if(t>=5)ans++;t=0;}else t++;}if(t>=5)ans++;}for(int i=0;i<n;++i){t=0;int x=i,y=0;while(x<n&&y<n){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y++;}if(t>=5)ans++;}for(int j=1;j<n;++j){t=0;int x=0,y=j;while(x<n&&y<n){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y++;}if(t>=5)ans++;}for(int j=0;j<n;++j){t=0;int x=0,y=j;while(x<n&&y>=0){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y--;}if(t>=5)ans++;}for(int i=1;i<n;++i){//j=n-1t=0;int x=i,y=n-1;while(x<n&&y>=0){if(chess[x][y]!='w'){if(t>=5)ans++;t=0;}else t++;x++;y--;}if(t>=5)ans++;}return ans;
}int find(int x,int y,int sign){if(sign){if(chess[x][y]=='*')chess[x][y]='w';else return 0;}int t=check();	if(sign)chess[x][y]='*';return t;
}struct babi{int x,y;
};
bool cmp(babi a,babi b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;
}int main(){ios::sync_with_stdio(false);cin>>n;for(int i=0;i<n;++i){for(int j=0;j<n;++j)cin>>chess[i][j];}int mx=find(0,0,0);//cout<<mx<<"\n";babi res[10000];int k=0;for(int i=0;i<n;++i){for(int j=0;j<n;++j){if(find(i,j,1)>mx){res[k].x=i;res[k++].y=j;}}}sort(res,res+k,cmp);for(int i=0;i<k;++i){cout<<res[i].y<<" "<<res[i].x<<'\n';}return 0;
}

http://www.dtcms.com/a/310106.html

相关文章:

  • 在 uni-app 中进行路由跳转前的权限验证(检查用户是否登录)
  • OCC任务新SOTA!华科提出SDGOCC:语义深度双引导的3D占用预测框架(CVPR 2025)
  • 基于Pipeline架构的光存储读取程序 Qt版本
  • ansible简单playbook剧本例子3-安装nginx
  • Typora v1.10.8 好用的 Markdown 编辑器
  • 【2】专业自定义图表创建及应用方法
  • flutter release调试插件
  • 通过pendingIntent启动activity被block问题
  • C语言数据结构(3)单链表专题1.单链表概述
  • NDBmysql-cluster融合脚本
  • (二)LoRA微调BERT:为何在单分类任务中表现优异,而在多分类任务中效果不佳?
  • Spring Boot微服务性能优化实践指南:从配置到监控
  • SpringCloud(一)微服务基础认识
  • 什么是三防平板电脑?三防平板有什么作用?
  • 浏览器【详解】自定义事件 CustomEvent
  • AUTOSAR进阶图解==>AUTOSAR_SRS_FlashTest
  • EasyGBS的两种录像回看
  • ROS主控和stm32小车底盘通过串口进行通讯
  • 信奥骗分导论
  • 镜像快速部署ollama+python+ai
  • 光储知识积累
  • 全渠道融合:智能引擎重塑鞋服业价值链条
  • 88、【OS】【Nuttx】【启动】栈溢出保护:volatile 关键字(修饰内联汇编)
  • 15day-人工智学习-机器学习-介绍和定义
  • 【Linux】Linux下基本指令
  • 【暑期每日一题】洛谷 P9390 金盏花
  • SketchUp扩展工具分享:Ropefall v1.02插件轻松实现绳索模拟
  • 京东云轻量云服务器与腾讯云域名结合配置网站及申请SSL证书流程详解
  • 【Linux】磁盘存储+文件系统简介
  • android嵌套网页遇到的问题总结