题解
围棋遍历
http://www.nowcoder.com/questionTerminal/2242f11982e44881b749d9d188f0ccf5
对于,C++,他给了我函数模块
还写了一个TODO
#include <stdio.h>
#include <string.h>
enum color {
NONE, WHITE, BLACK, //棋子颜色,NONE表示未落子
};
struct weiqi {
enum color board[19][19]; //棋盘上每个位置的落子
};
//----------------------------------------------------
int test[19][19];//辅助BFS,用于剪枝
void BFS(struct weiqi *wq, int x, int y,int &res, int val)
{
if((x<0)||(y<0)||(x>18)||(y>18))
return ;
if(val!=(wq->board[y][x]))
return ;
if(test[y][x]==0&&val==(wq->board[y][x]))
{
res++;
test[y][x]=1;
}
else
{
return;
}
BFS(wq, x, y-1,res, val);//上
BFS(wq, x, y+1,res, val);//下
BFS(wq, x-1, y,res, val);//左
BFS(wq, x+1, y,res, val);//右
return ;
}
int calc(struct weiqi *wq, int x, int y)
{
//TODO:
int res=0;
int val = wq->board[y][x];//坑的地方
if(val==0)//特殊情况
{
return 0;
}
BFS(wq, x, y,res, val);
return res;
}
//------------------------------------------------------------------------
int input(struct weiqi *wq, int *x, int *y)
{
int row, col;
int ret;
char buf[80];
for (row = 0; row < 19; ++row) {
if (fgets(buf, sizeof(buf), stdin) == NULL)
return -1;
if (strlen(buf) < 19)
return -1;
for (col = 0; col < 19; ++col) {
switch (buf[col]) {
case '0':
wq->board[row][col] = NONE;
break;
case '1':
wq->board[row][col] = WHITE;
break;
case '2':
wq->board[row][col] = BLACK;
break;
default:
return -1;
}
}
}
ret = fscanf(stdin, "%d,%d\n", x, y);
if (ret != 2)
return -1;
for (row = 0 ; row < 19; ++row) {
for (col = 0; col < 19; ++col) {
fprintf(stderr, "%d ", wq->board[row][col]);
}
fprintf(stderr, "\n");
}
fprintf(stderr, "x = %d, y = %d\n", *x, *y);
return 0;
}
int main()
{
struct weiqi wq;
int x = 0, y = 0;
int cnt;
memset(&wq, 0, sizeof(wq));
if (input(&wq, &x, &y) < 0) {
fprintf(stderr, "error!\n");
return 1;
}
cnt = calc(&wq, x, y);
printf("%d\n", cnt);
return 0;
} 我就以为,只能在那个函数里面写,后面发现。。。(我提交之后,看别人的代码,发现他们有的————似乎也是这么做的)所以应该可以
我还可以在外面继续写其他函数。。。。还可以写全局变量。。。
这次的BFS,我AC掉了
本来想用队列和bool标记有没有被
PS:其实要是提交C语言啥的,,,,还没有这些模块啥的出来。。。。所以,应该上面的操作是合法的。
查看24道真题和解析
