当前位置: 首页 > news >正文

2024团体程序设计天梯赛L3-1 夺宝大赛

L3-037 夺宝大赛
分数 30
作者 陈越
单位 浙江大学
夺宝大赛的地图是一个由 n×m 个方格子组成的长方形,主办方在地图上标明了所有障碍、以及大本营宝藏的位置。参赛的队伍一开始被随机投放在地图的各个方格里,同时开始向大本营进发。所有参赛队从一个方格移动到另一个无障碍的相邻方格(“相邻”是指两个方格有一条公共边)所花的时间都是 1 个单位时间。但当有多支队伍同时进入大本营时,必将发生火拼,造成参与火拼的所有队伍无法继续比赛。大赛规定:最先到达大本营并能活着夺宝的队伍获得胜利。
假设所有队伍都将以最快速度冲向大本营,请你判断哪个队伍将获得最后的胜利。

输入格式:
输入首先在第一行给出两个正整数 m 和 n(2<m,n≤100),随后 m 行,每行给出 n 个数字,表示地图上对应方格的状态:1 表示方格可通过;0 表示该方格有障碍物,不可通行;2 表示该方格是大本营。题目保证只有 1 个大本营。
接下来是参赛队伍信息。首先在一行中给出正整数 k(0<k<m×n/2),随后 k 行,第 i(1≤i≤k)行给出编号为 i 的参赛队的初始落脚点的坐标,格式为 x y。这里规定地图左上角坐标为 1 1,右下角坐标为 n m,其中 n 为列数,m 为行数。注意参赛队只能在地图范围内移动,不得走出地图。题目保证没有参赛队一开始就落在有障碍的方格里。

输出格式:
在一行中输出获胜的队伍编号和其到达大本营所用的单位时间数量,数字间以 1 个空格分隔,行首尾不得有多余空格。若没有队伍能获胜,则在一行中输出 No winner.

输入样例 1:
5 7
1 1 1 1 1 0 1
1 1 1 1 1 0 0
1 1 0 2 1 1 1
1 1 0 0 1 1 1
1 1 1 1 1 1 1
7
1 5
7 1
1 1
5 5
3 1
3 5
1 4
输出样例 1:
7 6
样例 1 说明:
七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6,其中队伍 4 和 5 火拼了,队伍 3 和 6 火拼了,队伍 7 比队伍 1 早到,所以获胜。

输入样例 2:
5 7
1 1 1 1 1 0 1
1 1 1 1 1 0 0
1 1 0 2 1 1 1
1 1 0 0 1 1 1
1 1 1 1 1 1 1
7
7 5
1 3
7 1
1 1
5 5
3 1
3 5
输出样例 2:
No winner.
代码长度限制
16 KB
Java (javac)
时间限制
800 ms
内存限制
256 MB
其他编译器
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
原来图论还可以这样打,原来我也是能做对L3的
上代码

#include <bits/stdc++.h>
using namespace std;
const int N=2e2+9;
int g[N][N],d[N][N];
typedef long long ll;
typedef pair<int,int> pii;
vector<pii>s;
int x,y;
int xx[4]={0,0,-1,1};
int yy[4]={-1,1,0,0};
int cnt[N];
int n,m;
void dfs(){
	queue<pii>q;
	q.emplace(x,y);
	//q.push({x,y});
	while(!q.empty()){
		pii z=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int dx=z.first+xx[i];
			int dy=z.second+yy[i];
            if(dx<1||dy<1||dx>n||dy>m)continue;
			if(!g[dx][dy]||d[dx][dy])continue;
			q.emplace(dx,dy);
			d[dx][dy]=d[dx-xx[i]][dy-yy[i]]+1;
		}
	}
}
void solve() {
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>g[i][j];
			if(g[i][j]==2){
				x=i,y=j;
			}
		}
	}
	int k;
	cin>>k;
	for(int i=1;i<=k;i++){
		int a,b;
		cin>>a>>b;
		swap(a,b);
		s.push_back({a,b});
	}
	dfs();
	for(int i=0;i<k;i++){
		cnt[d[s[i].first][s[i].second]]++;
	}
	int mi=999,id=-1;
	for(int i=0;i<k;i++){
		int z=d[s[i].first][s[i].second];
		if(cnt[z]==1&&z<mi&&z)mi=z,id=i+1;
	}
	if(id==-1){
		cout<<"No winner.";
	}
	else cout<<id<<' '<<mi;
}
int main() {
    solve();
    return 0;
}

相关文章:

  • 【ROS2】行为树 BehaviorTree(二):传递参数(黑板和端口)
  • day28图像处理OpenCV
  • 服务器本地搭建
  • FPGA_UART
  • 刷题记录(3)C语言中的字符
  • LlamaIndex学习
  • Fiddler为什么可以看到一次HTTP请求数据?
  • 项目班——0408
  • 【神经网络】python实现神经网络(四)——误差反向传播的基础理论
  • AI与我共创WEB界面
  • 风丘年度活动:2025年横滨汽车工程展览会
  • java中常用的集合 - 面试篇
  • 【NIO番外篇】之组件 Selector
  • 【Redis】布隆过滤器应对缓存穿透的go调用实现
  • malloc、operator new、new的关系
  • c语言练习4
  • NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
  • 常见攻击方式及防范措施
  • 基于PHP的酒店网上订房系统(源码+lw+部署文档+讲解),源码可白嫖!
  • Oracle数据库数据编程SQL<9.3 数据库逻辑备份和迁移Data Pump (EXPDP/IMPDP) 导出、导入补充>
  • 收缩非洲业务专注挖矿,裁减大批外交官,“美国务院改革草案”引争议
  • 罗马教皇方济各去世
  • 阿塞拜疆总统阿利耶夫将访华
  • 跑马,一场对机器人的长测试
  • 经济日报:“关税讹诈”拦不住中国制造升级
  • 五一假期出行预订进入高潮:酒店搜索热度翻倍,“请4休11”拼假带动长线游