体委能否吃上饭呢

【题目描述】

由于我们的恶人体委不让我们吃饭又让自已第一个吃饭,导致我们非常愤怒,于是便决定要掀了体委的餐盘,体委为了不让自己饿肚子,便必须第一个到食堂

【输入格式】

第一行六个数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 个赞

???

2 个赞
\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 个赞

所以只有我一人不懂吗? 体委怎么才算能吃上饭,同学怎么拦截他呢?

1 个赞

同学比体委先到就可以掀翻体委的餐盘了呀 @陈之昊羽

1 个赞

哦 就是比有没有比体委先到的同学是吧

1 个赞

对呀

1 个赞

每个同学一次只能走一个方向吗?

1 个赞

对的

1 个赞

但会自动停下
比如遇到障碍
@陈之昊羽

1 个赞

那是只能走固定步数吗?

1 个赞

只有遇到东西才能停

1 个赞

大快人心

1 个赞

万一有的同学一次走两步怎么办

1 个赞

你倒是改啊

1 个赞

我能一次走114514步回回撞墙上

1 个赞

我怎么就不当言论了???

2 个赞

so my 100m =)

1 个赞

昨天不叫我,服了

1 个赞