zoukankan      html  css  js  c++  java
  • 百练3723:围棋

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述
    围棋的棋盘上有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

    分析:

      DFS遍历,只统计一种棋子的数量。

    #include <cstdio>
    #include <string.h>
    #define N 102
    char w[N][N];
    bool mark[N][N];
    int n,num,u,v;
    int go[][2]={1,0,-1,0,0,1,0,-1};
    void DFS(int x,int y){
        num++;
        mark[x][y] = true;
        for(int i = 0;i < 4;i++){
            u = x + go[i][0];
            v = y + go[i][1];
            if(!mark[u][v] && w[u][v] == '.')
                DFS(u,v);
        }
        return;
    }
    int main(){
        scanf("%d",&n);
        memset(w,'#',sizeof(w));
        getchar();
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= n;j++)
            scanf("%c",&w[i][j]);
            getchar();
        }
        num = 0;
        for(int i = 1;i <= n;i++)
        for(int j = 1;j <= n;j++){
            if(w[i][j] == 'B' && !mark[i][j])
                DFS(i,j);
        }
        printf("%d %d",num,n*n - num);
    }
  • 相关阅读:
    一个改写MBR的例子
    explore没有桌面
    Guidance of Set up FTP Server
    重启远程机器(不登录远程机器下的重启)
    Eclipse 一些小知识
    check time period
    Scrum 冲刺——Day 1
    Scrum 冲刺——Day 2
    初学C语言
    CSS选择器
  • 原文地址:https://www.cnblogs.com/starryxsky/p/7103308.html
Copyright © 2011-2022 走看看