楼逸杨
(楼逸杨)
1
【题目描述】
由于我们的恶人体委不让我们吃饭又让自已第一个吃饭,导致我们非常愤怒,于是便决定要掀了体委的餐盘,体委为了不让自己饿肚子,便必须第一个到食堂
【输入格式】
第一行六个数x1,y1,x2,y2,n,m表示体委坐标,食堂的坐标,有几个人,路上有几个障碍物
然后n+1行每行三个数,表示同学的坐标与他每次能动几格(体委默认只能动一格,毕竟他的腿被打瘸了)
然后1+n+m行每行两个数表示障碍物的坐标
【输出格式】
体委如果能吃到饭 输出 No way!
否则输出Well done!!!
样例1
输入
1 1 1 2 3 2
2 1 1
3 2 1
4 4 1
3 4
2 2
输出
No way!
样例2
输入
55 55 1 1 1 0
1 2 1
输出
Well done!!!
【数据范围】
0小于等于x1,y1,x2,y2小于等于1000
@周晨捷 @俞天行 @linan04103 @金文彦成 @陈之昊羽
1 个赞
俞天行
(Star lit Journey「y.t.x」)
3
\Huge 好题!
能改出来我服你
#include <bits/stdc++.h>
using namespace std;
int dx[] = {1, -1, 0, 0}; // 体委移动的方向(上下左右)
int dy[] = {0, 0, 1, -1};
int vis[1001][1001]; // 访问标记
int grid[1001][1001]; // 地图(0 = 障碍物,1 = 通行)
int n, m; // n为同学数量,m为障碍物数量
int stx, sty, enx, eny; // 体委坐标和食堂坐标
bool flag = 0;
struct Student {
int x;
int y;
int step; // 每次能动的步数
};
Student students[100]; // 存储同学的信息
struct node {
int x, y, cnt; // 当前坐标和步数
};
queue<node> qu; // BFS 队列
void bfs(int x, int y) {
qu.push({x, y, 0});
vis[x][y] = 1; // 标记体委初始位置已访问
while (!qu.empty()) {
node now = qu.front();
qu.pop();
// 如果到达食堂
if (now.x == enx && now.y == eny) {
cout << "No way!" << endl;
flag = 1;
return;
}
// 体委移动
for (int i = 0; i < 4; i++) {
int now_x = now.x + dx[i];
int now_y = now.y + dy[i];
if (now_x < 0 || now_y < 0 || now_x >= 1001 || now_y >= 1001 || vis[now_x][now_y] || grid[now_x][now_y] == 0) {
continue; // 越界或已访问或是障碍物
}
vis[now_x][now_y] = 1; // 标记为访问
qu.push({now_x, now_y, now.cnt + 1}); // 加入队列
}
// 检查每个同学的可移动性
for (int j = 0; j < n; j++) {
for (int step = 1; step <= students[j].step; step++) {
for (int i = 0; i < 4; i++) {
int new_x = students[j].x + step * dx[i];
int new_y = students[j].y + step * dy[i];
// 验证新位置
if (new_x < 0 || new_y < 0 || new_x >= 1001 || new_y >= 1001 || vis[new_x][new_y] || grid[new_x][new_y] == 0) {
continue; // 越界或已访问或是障碍物
}
vis[new_x][new_y] = 1; // 标记为访问
qu.push({new_x, new_y, now.cnt + 1}); // 加入队列
}
}
}
}
}
int main(void)
{
cin >> stx >> sty >> enx >> eny >> n >> m;
// 初始化格子,标记为可通行
for (int i = 0; i < 1001; i++) {
for (int j = 0; j < 1001; j++) {
grid[i][j] = 1; // 1表示通行
}
}
// 输入障碍物
for (int i = 0; i < m; i++) {
int obs_x, obs_y;
cin >> obs_x >> obs_y;
grid[obs_x][obs_y] = 0; // 0表示障碍物
}
// 输入同学信息
for (int i = 0; i < n; i++) {
cin >> students[i].x >> students[i].y >> students[i].step;
}
// 执行BFS从体委的起始位置开始
bfs(stx, sty);
if (flag == 0) {
// 到达这里表明体委无法到达食堂
cout << "Well done!!!" << endl;
}
return 0;
}
@楼逸杨
1 个赞
陈之昊羽
(༺ཌༀཉི想养一只猫头鹰༃ༀད༻)
4
所以只有我一人不懂吗? 体委怎么才算能吃上饭,同学怎么拦截他呢?
1 个赞
楼逸杨
(楼逸杨)
5
同学比体委先到就可以掀翻体委的餐盘了呀 @陈之昊羽
1 个赞