• 围棋程序


    Description

    小A喜欢围棋,这天他心血来潮想要设计一个围棋小游戏,但是一个基本的问题是:该如何计算闭合线段围成的面积呢?

    比如在下面这个5*5的由“0 1”组成棋盘中,由“1”围出来的“0”的面积是:3。

    0 0 0 0 0
    0 1 1 1 1
    0 1 0 1 0
    1 0 0 1 1
    1 1 1 1 0

    规定:面积的计算方法是统计“1”所围成的闭合曲线中水平线和垂直线交点的数目,特别地,在边上的0不被计算,如第3行第5列的“0”不算作面积。

    Input

    一个10*10的棋盘矩阵,棋盘中每个点由0、1组成。

    Output

    由题意输出1围成的0的面积。

    Sample Input

    0 0 0 0 0 0 0 0 0 1
    0 0 0 0 0 0 0 0 0 1
    0 0 0 1 1 1 0 0 0 0
    0 0 0 1 0 0 1 1 1 0
    0 0 0 0 1 1 0 0 0 1
    0 0 0 0 0 1 0 0 1 0
    0 0 0 1 1 0 0 1 0 0
    0 0 0 1 0 0 0 1 0 0
    0 0 0 0 1 1 1 0 0 0
    0 0 0 0 1 1 1 0 0 0
    

    Sample Output

    12
    
     1 #include<iostream>
     2 //#include<fstream>
     3 using namespace std;
     4 int a[100][100];
     5 int dir[4][2]={1,0,0,-1,-1,0,0,1};
     6 void dfs(int x,int y){
     7     a[x][y]=1;
     8     int dx,dy;
     9     for(int i=0;i<4;i++){
    10         dx=x+dir[i][0];
    11         dy=y+dir[i][1];
    12         if(dx>=1&&dx<=10&&dy>=1&&dy<=10&&!a[dx][dy])
    13             dfs(dx,dy);
    14     }
    15 }
    16 int main(){
    17     int ans=0;
    18     //fstream file("haha.txt");
    19     for(int i=1;i<=10;i++){
    20         for(int j=1;j<=10;j++){
    21             //file>>a[i][j];
    22             cin>>a[i][j];
    23         }
    24     }
    25     for(int i=1;i<=10;i++){
    26         if(!a[1][i])    dfs(1,i);
    27         if(!a[10][i])    dfs(10,i);
    28         if(!a[i][1])    dfs(i,1);
    29         if(!a[i][10])    dfs(i,10);
    30     }
    31     for(int i=1;i<=10;i++){
    32         for(int j=1;j<=10;j++){
    33             if(!a[i][j])
    34                 ans++;
    35         }
    36     }
    37     cout<<ans<<endl;
    38     return 0;
    39 }
    View Code

     

    首先说方法,我们要把圈外的0都变成1,然后遍历整个数组数一数一共有几个0那么围成的面积就是几

    然后说一下怎么实现,主体思想是用dfs或者bfs,因为我们只想把圈外的0变成1,所以我们从边缘开始搜索

        for(int i=1;i<=10;i++){
            if(!a[1][i])    dfs(1,i);
            if(!a[10][i])    dfs(10,i);
            if(!a[i][1])    dfs(i,1);
            if(!a[i][10])    dfs(i,10);
        }

    这个代码实现的就是这一块,注意必须要从边缘开始,不能遍历整个数组搜索,如果遍历整个数组搜索的话,数组里所有的0都会变成1了。

    然后就是dfs的思想,上下左右连一块的算连着,斜着的不算,从边缘开始,所有连着的0变成1。





  • 相关阅读:
    [转]Oracle创建删除用户、角色、表空间、导入导出数据库命令行方式总结
    [转]23种设计模式与泡MM的关系
    [转]23种设计模式之间的关系
    [转]如何提高服务器的访问速度
    SVN所在的服务器IP改变了,肿么办
    HTML中ID与NAME的区别
    Java与.net异构平台上web service间复杂对象的互操作
    下一代OS系统展望之我见(针对windows,其他OS我不熟)
    使用axis开发java web service
    关于Java与DotNet异构平台WebService中enum对象的交互
  • 原文地址:https://www.cnblogs.com/fate-/p/12233487.html
Copyright © 2020-2023  润新知