Nwerc 2006【escape】

描述

给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上
矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。
在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下
你最少要走多少步才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d)
那么它们的距离为|a-c|+|b-d|。

输入

第一行给出数字N,X,Y
第二行给出x1,y1,x2,y2
下面将有N行,给出N个敌人所在的坐标

输出

在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。

输入样例1

2 5 6
0 0 4 0
2 1
2 3

输出样例1

2 14

解题思路

  这道题呢,我是用的二分枚举和敌人最小值的距离,然后先预处理每一个点与最近的敌人点的距离,最后搜索就好了。

题解

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int k,n,m;
 4 int qwe=0;
 5 int x1,y_1,x2,y2,ans=0;
 6 int mp[1005][1005];//每个点与最近的敌人的距离
 7 bool flag[1005][1005];
 8 struct node{
 9     int x;
10     int y;
11     int t;
12 };
13 queue<node> s;
14 bool p=true;
15 int dir[4][2]={0,1,0,-1,1,0,-1,0};
16 void bfs1()//初始化每个点与最近的敌人的距离
17 {
18     while(!s.empty())
19     {
20         node head=s.front();
21         s.pop();
22         for(int i=0;i<4;i++)
23         {
24             int tx=head.x+dir[i][0];
25             int ty=head.y+dir[i][1];
26             if(tx>=0&&ty>=0&&tx<n&&ty<m&&!mp[tx][ty])
27             {
28                 mp[tx][ty]=head.t+1;
29                 s.push((node){tx,ty,head.t+1});
30             }
31         }
32     }
33 }
34 bool bfs2(int mid)
35 {
36     queue<node> q;
37     memset(flag,0,sizeof(flag));//初始化标记
38     q.push((node){x1,y_1,0});
39     flag[x1][y_1]=true;
40     if(mp[x1][y_1]-1<mid)return false;//首先判断起点距离
41     while(!q.empty())
42     {
43         node head=q.front();
44         q.pop();
45         if(head.x==x2&&head.y==y2)
46         {
47             ans=head.t;
48             return true;//找到了
49         }
50         for(int i=0;i<4;i++)
51         {
52             int tx=head.x+dir[i][0];
53             int ty=head.y+dir[i][1];
54             if(mp[tx][ty]-1<mid)continue;//因为前面的敌人点是一,所以要减去一
55             if(tx>=0&&ty>=0&&tx<n&&ty<m&&!flag[tx][ty])
56             {
57                 flag[tx][ty]=true;//标记
58                 q.push((node){tx,ty,head.t+1});
59             }
60         }
61     }
62     return false;//没找到
63 }
64 int main()
65 {
66     cin>>k>>n>>m;
67     cin>>x1>>y_1>>x2>>y2;
68     for(int i=1;i<=k;i++)
69     {
70         int x,y;
71         scanf("%d%d",&x,&y);
72         mp[x][y]=1;//没有设置成0是因为后面搜索太麻烦
73         s.push((node){x,y,1});
74     }
75     bfs1();
76     int l=0,r=1000,mid;
77     while(l<r)//二分枚举距离
78     {
79         mid=(l+r)/2;
80         if(!bfs2(mid))r=mid;
81         else l=mid+1;
82     }
83     cout<<r-1<<" "<<ans;//最后不知道为什么要强制减一
84 }

原文地址:https://www.cnblogs.com/hualian/p/11223785.html

时间: 2024-08-06 15:38:08

Nwerc 2006【escape】的相关文章

POJ 2773 Happy 2006【容斥原理】

题目链接: http://poj.org/problem?id=2773 题目大意: 给你两个整数N和K,找到第k个与N互素的数(互素的数从小到大排列),其中 (1 <= m <= 1000000,1 <= K <= 100000000 ). 解题思路: K很大,直接从小到大枚举找出不现实,只能二分答案.二分枚举[1,INF]范围内所有的数x, 找到1~x范围内与N互素的数个数,如果等于K,则就是结果. 然后考虑1~x范围内与N互素的数个数 = x - 1~x范围内与N不互素的数个

POJ2773 Happy 2006【容斥原理】

题目链接: http://poj.org/problem?id=2773 题目大意: 给你两个整数N和K.找到第k个与N互素的数(互素的数从小到大排列).当中 (1 <= m <= 1000000,1 <= K <= 100000000 ). 解题思路: K非常大,直接从小到大枚举找出不现实,仅仅能二分答案.二分枚举[1.INF]范围内全部的数x, 找到1~x范围内与N互素的数个数.假设等于K,则就是结果. 然后考虑1~x范围内与N互素的数个数 = x - 1~x范围内与N不互素的

【HDOJ】2364 Escape

bfs.题目做的不细心,好多小错误.尤其注意起始点就是边界的情况.wa了八次. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 85 8 9 typedef struct node_st { 10 int x, y; 11 int d, s; 12 node_st(

【题解】gym102361E Escape(分层图)

[题解]gym102361E Escape(分层图) https://vjudge.net/problem/Gym-102361E 容易证明不会存在共用转换器的合法方案,因为出口互不相同且一旦共用转换器,要么以后走一样的路(这样就到最后两个机器人到了一个出口),要么有一个机器人的路径是非法的(同理). 由此可以推断一段路径最多只会被一个机器人覆盖(路径相交不算) 这道题最主要是观察到这个性质.然后就可以做了. 建立两张网格图G1和G2,一张图只有上下的边,另一张图只有左右的边.两张图的对应格子连

【ruby】ruby基础知识

Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for Linux tryhttp://www.rpmfind.net. Our first program(从此开始) Enter the following into the file, "test.rb". ? 1 puts "Howdy!" At the C: promp

SCI&amp;EI 英文PAPER投稿经验【转】

英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时间;另外,每个杂志都有他们的具体格式要求,一定要按照他们的要求把论文写好,免得浪费时间,前些时候,我的一个同事向一个著名的英文杂志投稿,由于格式问题,人家过两个星期就退回来了,而且说了很多难听的话,说投稿前首先就应该看清楚他们的格式要求:2. 论文写作一定要言简意赅,特别是摘要,引言和结论部分,特别

【转】T-SQL 教程

1 USE [test] 2 GO 3 /****** Object: StoredProcedure [dbo].[PageIndex] Script Date: 12/07/2011 10:26:36 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 ALTER PROCEDURE [dbo].[PageIndex] 9 ( 10 @Tbname varchar(100),--表名字 11 @Strfield

【体系结构】Oracle参数介绍

[体系结构]Oracle参数介绍 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Oracle中的各种参数介绍及其查询方法 ② Oracle中V$PARAMETER及V$PARAMETER2的区别 ③ 隐含参数的查询.重置.清除 ④ 会话参数和实例参数的查询 ⑤ 静态参数和动态参数.延迟参数 ⑥ V$PARAMETER视图的每列含义(重点) Tips: ①

【OEM】OEM安装维护

[OEM]OEM安装维护 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① oem安装和维护 ② OEM各种错误解决     Tips:        ① 若文章代码格式有错乱,推荐使用搜狗.QQ或360浏览器,也可以下载pdf格式的文档来查看,pdf文档下载地址:http://yunpan.cn/cdEQedhCs2kFz (提取码:ed