2023深信服A卷

1.

围棋遍历

函数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)

{

}

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32M,其他语言64M

输入描述:

第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

一个搜索DFS BFS都行。这边为了复习一下BFS,所以写了个BFS

#include <iostream>
#include<bits/stdc++.h>
#define  LL long long
#define  ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#include<queue>
using namespace std;
const double eps = 1e-2;
const int maxn = 25;
char MP[maxn][maxn];
int vis[maxn][maxn];
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,1,-1};

int ans = 1;
typedef struct node{
 int x,y;
 int step;
}node;
queue<node> q;

int bfs(int sx,int sy)
{
    mem(vis,0);
    char flag = MP[sx][sy];
    if(!q.empty()) q.pop();
    node t,nt;
    t.x = sx,t.y = sy;
    vis[sx][sy] = 1;
    q.push(t);
    while(!q.empty()){
        t = q.front();
        q.pop();
        int nx,ny,k;
        for(k = 0; k < 4; k++){
            nx = t.x + dx[k];
            ny = t.y + dy[k];
            if(nx >=0 && nx < 19 && ny >= 0 && ny < 19 && vis[nx][ny] == 0 && MP[nx][ny] == flag && MP[nx][ny]!='0'){
                nt.y = ny,nt.x = nx;
                vis[nx][ny] = 1;
                ans++;
                q.push(nt);
            }
        }
    }
    if (flag == '0')
      ans = 0;
    return ans;

}
int main()
{
    int sx,sy;
    for(int i = 0; i < 19; i++){
        scanf("%s",MP[i]);
    }
    scanf("%d,%d",&sx,&sy);
    printf("%d",bfs(sy,sx));


}

/*1
3 4
ATCC
CCTA
TCCB
*/

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值