题解
围棋遍历
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语言啥的,,,,还没有这些模块啥的出来。。。。所以,应该上面的操作是合法的。