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
*/