Problem Description
为了一些你们不知道的原因,我们把LOL的地图抽象为一个n×m的矩阵
提莫积攒了k个蘑菇准备种到地图上去,因为提莫的背篓漏了,所以每一个提莫走过的地方都会被摆下一个蘑菇,两个蘑菇同时种在一个地方的话就会爆炸,所以一旦即将出现这种情况,提莫会直接传送回家,防止自己被炸死
之前的排位赛中因为乱种蘑菇提莫已经被骂了好多次了,所以这次提莫特地查资料对当前地图的各个位置种下蘑菇的价值做了统计,但是因为提莫行动比较笨拙,所以他每次只能移动到上下左右四个方向的格子中(如果该方向有格子的话
每次行走提莫会从四个方向挑选一个权值最大的方向,如果有最大的权值有多个,他会从这多个相同的最大权值之中找出没有走过并且按照上下左右的优先顺序挑选一个合适的方向走。如果最大权值都被走过了,他会心灰意冷的传送回家,此时直接输出"BOOM"
(提莫会顺手在他的起点顺手种一个蘑菇下去Input
多组输入。
输入第一行包含地图大小n,m,蘑菇数量k。(1 <= n,m <= 100,1 <= k <= n*m)
接下来的n行每行有m个数(并且保证每个数的范围[1,1e5)
接下来两个整数x,y代表提莫的起点Output
如果走到最后没有地方可以种蘑菇了,但蘑菇还没全部种完,输出"BOOM".
如果蘑菇在半途中种完了,输出提莫所处的坐标"Teemo: x y".Sample Input
3 3 3 1 2 3 4 5 6 7 8 9 2 2 3 3 5 1 2 3 4 5 6 7 8 9 2 2Sample Output
Teemo: 3 3 BOOM
- #include<bits/stdc++.h>
- using namespace std;
- struct node
- {
- int x;
- int y;
- int num; //num用来记录到这个点时已经放了几个蘑菇
- };
- int mp[110][110];
- int vis[110][110];
- int n, m, k;
- int Next[4][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};
- void bfs(int x, int y)
- {
- struct node t, v, q[10005];
- int rear = 0, head = 0;
- int i, max, flag;
- t.x = x;
- t.y = y;
- t.num = 1;
- vis[x][y] = 1;
- q[rear++] = t;
- while(head < rear)
- {
- v = q[head++];
- if(v.num == k)
- {
- cout << "Teemo:" << " " << v.x << " " << v.y << endl;
- return ;
- }
- max = 0;
- flag = 0;
- for(i = 0; i < 4; i++) //找到上下左右的最大值
- {
- if(mp[v.x+Next[i][0]][v.y+Next[i][1]] > max)
- max = mp[v.x+Next[i][0]][v.y+Next[i][1]];
- }
- for(i = 0; i < 4; i++)
- {
- t.x = v.x + Next[i][0];
- t.y = v.y + Next[i][1];
- if(t.x>0 && t.y>0 && t.x<=n && t.y<=m && !vis[t.x][t.y] && mp[t.x][t.y] == max)
- {
- t.num = v.num+1;
- vis[t.x][t.y] = 1;
- flag = 1;
- q[rear++] = t;
- }
- }
- if(!flag) //flag等于0说明上下左右的a[t.x][t.y]不是最大值,最大值已经被走过
- {
- cout << "BOOM" << endl;
- return ;
- }
- }
- cout << "BOOM" << endl;
- }
- int main()
- {
- int i, j, x, y;
- while(cin >> n >> m >> k)
- {
- memset(mp, 0, sizeof(mp));
- memset(vis, 0, sizeof(vis));
- for(i = 1; i <= n; i++)
- {
- for(j = 1; j <= m; j++)
- cin >> mp[i][j];
- }
- cin >> x >> y;
- bfs(x, y);
- }
- }