链接: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的更多相关文章

  1. Codeforces Round 542 (Div. 2)

    layout: post title: Codeforces Round 542 (Div. 2) author: "luowentaoaa" catalog: true tags ...

  2. Codeforces Round #542(Div. 2) CDE 思维场

    C https://codeforces.com/contest/1130/problem/C 题意 给你一个\(n*m\)(n,m<=50)的矩阵,每个格子代表海或者陆地,给出在陆地上的起点终 ...

  3. Codeforces Round #542(Div. 2) B.Two Cakes

    链接:https://codeforces.com/contest/1130/problem/B 题意: 给定n和 2 * n个数,表示i位置卖ai层蛋糕, 有两个人在1号,必须严格按照1-n的顺序买 ...

  4. Codeforces Round #542(Div. 2) A.Be Positive

    链接:https://codeforces.com/contest/1130/problem/A 题意: 给n个数,找出一个非0整数d,使所有n个数除以整数d后,数组中正数的数量>= n/2. ...

  5. Codeforces Round #542(Div. 2) D1.Toy Train

    链接:https://codeforces.com/contest/1130/problem/D1 题意: 给n个车站练成圈,给m个糖果,在车站上,要被运往某个位置,每到一个车站只能装一个糖果. 求从 ...

  6. Codeforces Round #542 (Div. 1) 题解

    开学了住校了打不了深夜场 好难受啊QwQ A 显然对于每个起点,我们只需要贪心记录这个起点出发出去的糖果数量以及离自己最近的糖果 因为这个起点最后一次装载糖果一定是装载终点离自己最近的那个糖果 $ O ...

  7. Codeforces Round #542 Div. 1

    A:显然对于起点相同的糖果,应该按终点距离从大到小运.排个序对每个起点取max即可.读题花了一年还wa一发,自闭了. #include<iostream> #include<cstd ...

  8. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解

    Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题目链接:https://codeforces.com/contest/1130 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. win10安装Anaconda+TensorFlow+配置PyCharm

    其实很简单,我这里也只是记录一下而已. 第一大坑:anaconda必须安装4.2以前的版本,不能安装4.3以后的 版本:满满的血泪史 因为我们需要安装自带的python必须是3.5,才可以调用Tens ...

  2. 3144: [Hnoi2013]切糕

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1526  Solved: 827[Submit][Status] ...

  3. vue 数组和对象渲染问题

    vue 数组和对象渲染问题 最近项目有点忙碌,遇到好多问题都没有总结(╥﹏╥),在开发过程中,取vuex中的数组渲染完成之后,再次修改数组的值,数据更新了,但是视图并没有更新.以为是数组更新的问题,后 ...

  4. 浅谈js执行机制

    关于js执行机制,老早之前就一直想写篇文章做个总结,因为和js执行顺序的面试题碰到的特别多,每次碰到总是会去网上查,没有系统地总结,搞得每次碰到都是似懂非懂的感觉,这篇文章就系统的总结一下js执行机制 ...

  5. 做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)

    代码: #include <stdio.h> #include <string.h> #include <string> #include <vector&g ...

  6. POJ1860 Currency Exchange —— spfa求正环

    题目链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

  7. python中optparse模块用法

    optparse模块主要用来为脚本传递命令参数,采用预先定义好的选项来解析命令行参数. 首先需要引入optparser模块,然后执行初始化,实例化一个OptionParser对象(可以带参,也可以不带 ...

  8. I.MX6 2G DDR3 16G eMMC

    /************************************************************************* * I.MX6 2G DDR3 16G eMMC ...

  9. ng 表单提交验证

    http://www.runoob.com/try/try.php?filename=try_ng_validate

  10. Eclipse的maven工程不小心移除了Maven Dependencies,如何添加回来?

    转自:https://blog.csdn.net/eininotop/article/details/71124533 选择该工程--> 点击右键--> 选择Properties--> ...