首页 > 试题广场 >

围棋遍历

[编程题]围棋遍历
  • 热度指数:1276 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
函数calc计算围棋中位置(x,y)处连成一片的棋子个数。所谓连成一片,即沿着棋盘横竖线往任意方向遍历,遍历过程允许转弯,不允许走斜线,中间未出现对方棋子或空子。

enum color {
    NONE, WHITE, BLACK,         // 棋子颜色,NONE表示未落子
};
struct weiqi {
    enum color board[19][19];   // 棋盘上每个位置的落子
};
int calc(struct weiqi *wq, int x, int y)
{
}


输入描述:
第1-19行数据是棋盘上棋子的颜色数据。0表示未落子,1表示白子,2表示黑子。 第1行最左边位置的坐标是(0,0),第1行第2列的坐标是(1,0),第2行第1列的坐标是(0,1),依此类推。 第20行数据是起始坐标(x,y)


输出描述:
与坐标(X,Y)连成一片的棋子数目
示例1

输入

0000000000000000000
0000011000000000000
0000001111000000000
0000001021000000000
0000001010100000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
5,1

输出

9
import java.util.*;

public class Main{
    public static void main(String args[]){
        Scanner in = new Scanner(System.in);
        int[][] grid = new int[19][19];
        for(int i=0; i<19; i++){
            String str = in.nextLine();
            char[] line = str.toCharArray();
            for(int j=0; j<19; j++){
                grid[i][j] = Integer.parseInt(String.valueOf(line[j]));
            }
        }
        String str2 = in.nextLine();
        String[] arr = str2.split(",");
        int y = Integer.parseInt(arr[0]);
        int x = Integer.parseInt(arr[1]);

        int flag = grid[x][y];
        int res = 0;
        res = dfs(grid, x, y, flag);
        System.out.print(res);
    }
    
    private static int dfs(int[][] grid, int x, int y, int flag){
        if(x<0 || y<0 || x>=19 || y>=19){
            return 0;
        }
        
        if(grid[x][y] == 0 || grid[x][y] != flag){
            return 0;
        }
        
        int num = 0;
        
        if(grid[x][y] == flag){
            num = num+1;
            grid[x][y] = 0;
            num += dfs(grid, x-1, y, flag) 
             + dfs(grid, x+1, y, flag)
             + dfs(grid, x, y-1, flag)
             + dfs(grid, x, y+1, flag);
        }
        
        return num;
    }
}
发表于 2022-07-07 11:24:11 回复(0)