Codeforces Round #542(Div. 2) C.Connect
链接:https://codeforces.com/contest/1130/problem/C
题意:
给一个n*n的图,0表示地面,1表示水,给出起点和终点,
现要从起点到达终点,有一次在两个坐标间创立隧道的机会,消耗为(x1 - x2)^2 + (y1 - y1)^2。
求出最小的消耗,如果直接能走到,则消耗为0。
思路:
bfs求出起点和终点分别能到达的点,枚举每一种情况,取最小值即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int Next[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
const int MAXN = 50 + 5;
char Map[MAXN][MAXN];
int vis[MAXN][MAXN];
int n, r1, r2, c1, c2;
int Bfs()
{
queue<pair<int, int>> que;
vector<pair<int, int>> start;
vector<pair<int, int>> ends;
que.push(make_pair(r1, c1));
vis[r1][c1] = 1;
while (!que.empty())
{
int x = que.front().first;
int y = que.front().second;
start.push_back(make_pair(x, y));
if (x == r2 && y == c2)
return 0;
for (int i = 0;i < 4;i++)
{
int nx = x + Next[i][0];
int ny = y + Next[i][1];
if (nx < 1 || nx > n || ny < 1 || ny > n)
continue;
if (vis[nx][ny] || Map[nx][ny] == '1')
continue;
vis[nx][ny] = 1;
que.push(make_pair(nx, ny));
}
que.pop();
}
que.push(make_pair(r2, c2));
vis[r2][c2] = 1;
while (!que.empty())
{
int x = que.front().first;
int y = que.front().second;
ends.push_back(make_pair(x, y));
for (int i = 0;i < 4;i++)
{
int nx = x + Next[i][0];
int ny = y + Next[i][1];
if (nx < 1 || nx > n || ny < 1 || ny > n)
continue;
if (vis[nx][ny] || Map[nx][ny] == '1')
continue;
vis[nx][ny] = 1;
que.push(make_pair(nx, ny));
}
que.pop();
}
int res = 9999;
/*
for (int i = 0;i < start.size();i++)
cout << start[i].first << ' ' << start[i].second << endl;
cout << endl;
for (int i = 0;i < ends.size();i++)
cout << ends[i].first << ' ' << ends[i].second << endl;
cout << endl;
*/
for (int i = 0;i < start.size();i++)
{
for (int j = 0;j < ends.size();j++)
{
int cx = start[i].first - ends[j].first;
int cy = start[i].second - ends[j].second;
int cost = cx * cx + cy * cy;
res = min(res, cost);
}
}
return res;
}
int main()
{
cin >> n;
cin >> r1 >> c1 >> r2 >> c2;
for (int i = 1;i <= n;i++)
{
for (int j = 1; j <= n; j++)
cin >> Map[i][j];
}
cout << Bfs() << endl;
return 0;
}
Codeforces Round #542(Div. 2) C.Connect的更多相关文章
- Codeforces Round 542 (Div. 2)
layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...
- Codeforces Round #542(Div. 2) CDE 思维场
C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...
- Codeforces Round #542(Div. 2) B.Two Cakes
链接:https://codeforces.com/contest/1130/problem/B 题意: 给定n和 2 * n个数,表示i位置卖ai层蛋糕, 有两个人在1号,必须严格按照1-n的顺序买 ...
- Codeforces Round #542(Div. 2) A.Be Positive
链接:https://codeforces.com/contest/1130/problem/A 题意: 给n个数,找出一个非0整数d,使所有n个数除以整数d后,数组中正数的数量>= n/2. ...
- Codeforces Round #542(Div. 2) D1.Toy Train
链接:https://codeforces.com/contest/1130/problem/D1 题意: 给n个车站练成圈,给m个糖果,在车站上,要被运往某个位置,每到一个车站只能装一个糖果. 求从 ...
- Codeforces Round #542 (Div. 1) 题解
开学了住校了打不了深夜场 好难受啊QwQ A 显然对于每个起点,我们只需要贪心记录这个起点出发出去的糖果数量以及离自己最近的糖果 因为这个起点最后一次装载糖果一定是装载终点离自己最近的那个糖果 $ O ...
- Codeforces Round #542 Div. 1
A:显然对于起点相同的糖果,应该按终点距离从大到小运.排个序对每个起点取max即可.读题花了一年还wa一发,自闭了. #include<iostream> #include<cstd ...
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解
Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题目链接:https://codeforces.com/contest/1130 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
随机推荐
- FIR300M刷openwrt
淘宝看到一款FIR300M路由器,当时只要19.9元.图便宜就买了. Hardware Architecture: MIPS Vendor: MediaTek (Ralink) Bootloader: ...
- mysql下distinct和group by区别对比
在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group ...
- Android 代码写控件
1.设置dialog弹出anthor public static SearchDialog getSearchDialog(Context context,OnDismissListener list ...
- ros使用时的注意事项&技巧2
1.查看参数列表 rosparam list 2.查询参数rosparam get parameter_name,如rosparam get /rosdistro 3.设置参数rosparam set ...
- code::Blocks 汉化经验
首先,在网上下载一个code::Block的汉化包 code::Block汉化包下载地址,复制到地址栏即可. http://files.cnblogs.com/files/QW-lzm/codebl ...
- linux初级学习笔记一:linux操作系统及常用命令,及如何获取命令的使用帮助!(视频序号:02_1,2)
本节学习的命令:ls,cd,type,pwd, printenv, hash, date, clock, man, hwclock, info, cal, echo, printf, file! 本节 ...
- 什么是Intent
Intent负责在应用程序的主要部件——活动,服务,广播接收器(处理Android消息)之间传递消息的信使对象 Intent是对要执行的操作的一种抽象的描述,它除了指定一个动作之外,Intent对象还 ...
- ubuntu安装wine+plsql
1.在ubuntu下装了win7的虚拟机,在使用plsql进行开发的时候发现很慢很卡,经常半天反应不过来.机器是不差的,1w5的thinkstation,实在受不了这种 速度,想着在ubuntu下搞一 ...
- I.MX6 Android busybox 从哪里生成的
/**************************************************************************** * I.MX6 Android busybo ...
- assign.py
#链式赋值 m=n=[1,2,3] m[0]=2 print(m,n) #m,n都改变了 x=y='xxx' y='yyy' print(x,y) #只有y 改变 #序列解包 x,y,z=1,2,3 ...