围棋(隐藏的BFS)

2023-12-01 21:20
文章标签 隐藏 bfs 围棋

本文主要是介绍围棋(隐藏的BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

围棋

描述:

围棋的棋盘上有19*19条线交织成的361个交点,黑棋和白棋可以下在交点上。我们称这些交点为“目”。

一个目的上下左右四个方向,称之为“气”,如果一个目的四个方向都被某一种颜色的棋子占据,那么即使这个目上并没有棋子,仍然认为这个目被该颜色棋子占据。

如下图中,四个黑棋中心的交点,由于被黑棋包围,因此我们认为这个目属于黑棋,


黑棋拥有4+1=5目



在棋盘的边框地区,只要占据目的三个方向,就可以拥有这个目。


黑棋拥有3+1=4目



同理在棋盘的四个角上,只要占据目的两个气即可。
 


黑棋拥有2+1=3目




推而广之,当有多个目互相连通的时候,如果能用一种颜色把所有交点的气都包裹住,那么就拥有所有目。


黑棋拥有6+2 = 8目



请编写一个程序,计算棋盘上黑棋和白棋的目数。
输入数据中保证所有的目,不是被黑棋包裹,就是被白棋包裹。不用考虑某些棋子按照围棋规则实际上是死的,以及互相吃(打劫),双活等情况。

输入:

第一行,只有一个整数N(1<=N<=100),代表棋盘的尺寸是N * N
第2~n+1行,每行n个字符,代表棋盘上的棋子颜色。

“.”代表一个没有棋子的目
“B”代表黑棋
“W”代表白棋
 

输出:

只有一行,包含用空格分隔的两个数字,第一个数是黑棋的目数,第二个数是白棋的目数。
 

样例输入:

4
..BW
...B
....
....

复制

样例输出:

15 1

 如果不是出现再BFS专题里,个人觉得还是比较难想到广搜,毕竟前文给出很多包含目的情况。

思路:因为所有的目不是被黑棋包裹,就是被白棋包裹,且不考虑其他情况,所以直接逐个从黑棋进行广度优先遍历,凡是黑棋能到达的目,这个目必属于黑棋;不能到达的则属于白棋。(黑棋不能到达的目一定是被白棋包围了)

注意:1.必须将矩阵全部输入后再对其遍历,逐个从黑棋广搜

           2.黑棋到达过的地方不用再搜(book[i][j]=1)

           3.每次从黑棋广搜,到达一目即black++;

AC代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;#define x first
#define y secondconst int N=110;
char g[N][N];
int book[N][N];
int black=0,n;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
typedef pair<int,int> PII;
PII start,now,ne;void bfs(int xx,int yy)
{queue<PII> q;q.push({xx,yy});book[xx][yy]=1;black++;while(q.size()){now=q.front();q.pop();for(int k=0;k<4;k++){ne.x=now.x+dx[k],ne.y=now.y+dy[k];if(ne.x<0||ne.x>=n||ne.y<0||ne.y>=n) continue;if(book[ne.x][ne.y]||g[ne.x][ne.y]=='W') continue;book[ne.x][ne.y]=1;black++;q.push({ne.x,ne.y});}}
} int main()
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%s",&g[i]);}for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(!book[i][j]&&g[i][j]=='B') bfs(i,j);}}printf("%d %d",black,n*n-black);return 0;
}

 

这篇关于围棋(隐藏的BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/442736

相关文章

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

恶意PNG:隐藏在图片中的“恶魔”

&lt;img src=&quot;https://i-blog.csdnimg.cn/blog_migrate/bffb187dc3546c6c5c6b8aa18b34b962.jpeg&quot; title=&quot;214201hhuuhubsuyuukbfy_meitu_1_meitu_2.jpg&quot;/&gt;&lt;/strong&gt;&lt;/span&gt;&lt;

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

微信小程序uniappvue3版本-控制tabbar某一个的显示与隐藏

1. 首先在pages.json中配置tabbar信息 2. 在代码根目录下添加 tabBar 代码文件 直接把微信小程序文档里面的四个文件复制到自己项目中就可以了   3. 根据自己的需求更改index.js文件 首先我这里需要判断什么时候隐藏某一个元素,需要引入接口 然后在切换tabbar时,改变tabbar当前点击的元素 import getList from '../

双头BFS

牛客月赛100 D题,过了80%数据,调了一下午。。。烦死了。。。 还是没调试出来,别人的代码用5维的距离的更新有滞后性,要在遍历之前要去重。。。 #include<bits/stdc++.h>using namespace std;const int N=2e3+10;char g[N][N];int dis[N][N],d1[N][N];int n,m,sx,sy;int dx