Problem 83: 能吃几个子
Time Limit:1 Ms| Memory Limit:64 MB
Difficulty:1
Description
楚河-汉界”
,将中国象棋的棋盘分成两大阵营;棋盘上的棋子,最普通的莫过于“兵”
和“卒”
;对他们来讲,过“河”难,过“河”后更难;因为他们只能前进,不可退后。
Peter 刚刚学会中国象棋。在一次与高手 John 的切磋中,Peter 不幸只剩下一个“卒”
了,而 John 还有很多棋子。
考虑到 Peter 初学,为了让游戏不至于过快结束,John 对 Peter 说:
“这样吧,你把你
的‘卒’在 k 步以内能吃到的所有棋子全部拿掉。
” Peter 一下子晕了,他数不清该吃掉多
少个棋子了,你能帮他算出来吗?
,将中国象棋的棋盘分成两大阵营;棋盘上的棋子,最普通的莫过于“兵”
和“卒”
;对他们来讲,过“河”难,过“河”后更难;因为他们只能前进,不可退后。
Peter 刚刚学会中国象棋。在一次与高手 John 的切磋中,Peter 不幸只剩下一个“卒”
了,而 John 还有很多棋子。
考虑到 Peter 初学,为了让游戏不至于过快结束,John 对 Peter 说:
“这样吧,你把你
的‘卒’在 k 步以内能吃到的所有棋子全部拿掉。
” Peter 一下子晕了,他数不清该吃掉多
少个棋子了,你能帮他算出来吗?
Input
第一行一个正整数 T(T≤100),表示测试用例的组数。每组测试用例第一行输入一个正
整数 k (k ≤ 10),表示 Peter 可以连续走棋的步数。接下来的 5 行表示棋盘状态,每行一个
9 个字符的字符串,
其中’.’表示没有棋子,
’R’表示有 John 的棋子,
’B’表示这里是 Peter 的
“卒”
的位置(棋盘上有且只有一个’B’)
整数 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...
5
..RRR....
....R....
..R.R..R.
RR....B..
..R......
5
.........
..R......
.........
..R....R.
.....B...
Sample Output
Case 1: 6
Case 2: 2
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;
}