qdu83能吃几个子

来源:互联网 发布:js html格式化工具 编辑:程序博客网 时间:2024/04/25 20:16


Problem 83: 能吃几个子


Time Limit:1 Ms| Memory Limit:64 MB
Difficulty:1

Description

楚河-汉界”
,将中国象棋的棋盘分成两大阵营;棋盘上的棋子,最普通的莫过于“兵”
和“卒”
;对他们来讲,过“河”难,过“河”后更难;因为他们只能前进,不可退后。
Peter 刚刚学会中国象棋。在一次与高手 John 的切磋中,Peter 不幸只剩下一个“卒”
了,而 John 还有很多棋子。
考虑到 Peter 初学,为了让游戏不至于过快结束,John 对 Peter 说:
“这样吧,你把你
的‘卒’在 k 步以内能吃到的所有棋子全部拿掉。
” Peter 一下子晕了,他数不清该吃掉多
少个棋子了,你能帮他算出来吗?

Input

第一行一个正整数 T(T≤100),表示测试用例的组数。每组测试用例第一行输入一个正
整数 k (k ≤ 10),表示 Peter 可以连续走棋的步数。接下来的 5 行表示棋盘状态,每行一个
9 个字符的字符串,
其中’.’表示没有棋子,
’R’表示有 John 的棋子,
’B’表示这里是 Peter 的
“卒”
的位置(棋盘上有且只有一个’B’)

Output

每组测试用例输出一行,包括测试用例编号和 Peter 的“卒”最多能吃掉的棋子数。

Sample Input

2
5
..RRR....
....R....
..R.R..R.
RR....B..
..R......
5
.........
..R......
.........
..R....R.
.....B...

Sample Output

Case 1: 6
Case 2: 2

 分析:注意理解题意,一开始我就把题意理解错了,就用广搜做的,结果样例都不过,题意不是一个m步内,而是所有的m步内能吃到的棋子,应该用深搜。


#include <iostream>#include <cstdio>#include <queue>#include <cstring>#define CLR(arr, val) memset(arr, val, sizeof(arr))using namespace std;int dx[] = {0, 0, -1};int dy[] = {1, -1, 0};char map[6][10];bool visit[6][10];bool vis[6][10];int sum, m;void dfs(int x, int y, int num){if (num >= m + 1)return ;if (map[x][y] == 'R' && !vis[x][y]){sum++;vis[x][y] = 1;}for (int i = 0; i < 3; i++){int k = x + dx[i];int l = y + dy[i];if (k < 5 && l < 9 && k >= 0 && l >= 0 && !visit[k][l]){visit[k][l] = 1;dfs(k, l, num + 1);visit[k][l] = 0;}}}int main(){int n;scanf("%d", &n);int cun = 1;while (n--){sum = 0;CLR(map, 0);CLR(visit, 0);CLR(vis, 0);scanf("%d", &m);getchar();int x_st, y_st;for (int i = 0; i < 5; i++){gets(map[i]);for (int j = 0; j < 9; j++){if (map[i][j] == 'B'){x_st = i;y_st = j;}}}dfs(x_st, y_st, 0);printf("Case %d: %d\n", cun++, sum);}return 0;}


0 0
原创粉丝点击