noi.openjudge 2724:围棋 您所在的位置:网站首页 围棋就是计算 noi.openjudge 2724:围棋

noi.openjudge 2724:围棋

2024-07-01 04:38| 来源: 网络整理| 查看: 265

http://noi.openjudge.cn/ch0308/2724/

描述

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

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

如下图中,四个黑棋中心的交点,由于被黑棋包围,因此我们认为这个目属于黑棋, 在这里插入图片描述 黑棋拥有4+1=5目

在棋盘的边框地区,只要占据目的三个方向,就可以拥有这个目。 在这里插入图片描述 黑棋拥有3+1=4目

同理在棋盘的四个角上,只要占据目的两个气即可。 在这里插入图片描述

黑棋拥有2+1=3目

推而广之,当有多个目互相连通的时候,如果能用一种颜色把所有交点的气都包裹住,那么就拥有所有目。 在这里插入图片描述 黑棋拥有6+2 = 8目

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

输入

第一行,只有一个整数N(1 } }; int n,b = 0, w = 0,xx,yy; const int NMAX = 105; char c[NMAX][NMAX] = {}; bool visited[NMAX][NMAX]; void BFS(int i, int j) { if(visited[i][j])return; visited[i][j]=true; int cnt = 0; char _is = 'N'; queue q; q.push(Point(i,j)); while (!q.empty()) { Point t = q.front(); q.pop(); xx=t.x, yy=t.y; if(c[xx][yy]!='.'){ if(_is=='N') _is=c[xx][yy]; else if(_is!=c[xx][yy]) _is='X'; // printf("x:%d y:%d _is:%c\n",xx,yy,_is); continue; }else{ cnt++; } // printf("x:%d y:%d cnt:%d \n",xx,yy,cnt); if (yy q.push(Point(xx+1,yy)); if(c[xx+1][yy]=='.')visited[xx+1][yy]=true; } if (xx>0 && !visited[xx-1][yy]){ q.push(Point(xx-1,yy)); if(c[xx-1][yy]=='.')visited[xx-1][yy]=true; } if (yy>0 && !visited[xx][yy-1]){ q.push(Point(xx,yy-1)); if(c[xx][yy-1]=='.')visited[xx][yy-1]=true; } } if (_is=='B') b += cnt; else if (_is=='W') w += cnt; // cout cin >> c[i][j]; visited[i][j]=false; } for (i=0; i



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有