gym102443 D.Guess the Path

2024-03-02 08:18
文章标签 path guess gym102443

本文主要是介绍gym102443 D.Guess the Path,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目标题已经描述的很清楚了,明显是一道交互题,让你去向系统询问你猜的对不对,然后系统会给你反馈你那些点是取对了,然后你接着问,最多问10次。

当然这个10次包含明显的暗示,n,m都是1000,那么2^10刚好1024,暗示你用二分的操作来搞,你怎么样取构造这条路径才能达到一个最优,但是即使是想到了怎么去走但是如何去code还是很复杂。

队友盲猜了一个走的方式

对于每一个左上点到右下点我们都选择这样得走的方式,记录每一个点的后趋与前驱。(对应代码solve函数)

如这第一次走得,至少也得经过三个点(自己理解),系统会返回你走过的点

我们分别记录我们走得每一个点装到一个vector里边去

然后开始遍历vector里的相邻的两个点,如果两个点位置相邻(就是两个点挨着)就直接走

如果两个点不相邻

那么第一个点的后驱如果在第一个点的下边,我们就选择走右边,设右边这个点的位置为pos1,反之亦然

如果第二个点的前驱在第二个点的左边,我们就选择他上边那个点,设上边那个点的位置为pos2,反之亦然

对pos1,pos2进行solve

类似就变成了二分的过程

然后基本流程就就是这样,将确定的点丢到set里边,如果set里边的点==n+m-2的时候输出答案。

#include <bits/stdc++.h>
using namespace std;
#define pii(x,y) make_pair(x,y)
#define pr pair<int,int>
const int maxn=1e3+5;
int a[maxn][maxn];
map<pr,pr> pre,nex;
int n,m;
set<pr>ans;
vector<pr> v;
void solve(int sx,int sy,int ex,int ey)
{if(sx==ex&&sy==ey) return;pr pos=pii(sx,sy);int mid=(sx+ex+1)/2;while(pos.first<mid){cout<<"D";pre[pii(pos.first+1,pos.second)]=pii(pos.first,pos.second);nex[pii(pos.first,pos.second)]=pii(pos.first+1,pos.second);pos.first++;}while(pos.second<ey){cout<<"R";pre[pii(pos.first,pos.second+1)]=pii(pos.first,pos.second);nex[pii(pos.first,pos.second)]=pii(pos.first,pos.second+1);pos.second++;}while(pos.first<ex){cout<<"D";pre[pii(pos.first+1,pos.second)]=pii(pos.first,pos.second);nex[pii(pos.first,pos.second)]=pii(pos.first+1,pos.second);pos.first++;}
}
int main()
{cin>>n>>m;cout<<"? ";solve(1,1,n,m);cout<<endl;int c;cin>>c;int x,y;for(int i=1;i<=c;i++){cin>>x>>y;a[x][y]=1;ans.insert(pii(x,y));v.push_back(pii(x,y));}if(ans.size()==n+m-1){printf("! ");for(int i=1;i<v.size();i++){pr now=v[i],t=v[i-1];if(now.first==t.first+1) cout<<"D";else cout<<"R";}cout<<endl;return 0;}int tim=9;while(tim--){cout<<"? ";int cc=0;pr noww;noww.first=1,noww.second=1;cc++;while(1){if(a[noww.first+1][noww.second]) noww.first++,cc++,cout<<"D";else if(a[noww.first][noww.second+1]) noww.second++,cc++,cout<<"R";else{pr c=nex[noww];if(c.first==noww.first+1){cout<<"R";ans.insert(pii(noww.first,noww.second+1));pr d=v[cc];pr e=pre[d];if(e.first+1==d.first){ans.insert(pii(d.first,d.second-1));solve(noww.first,noww.second+1,d.first,d.second-1);cout<<"R";}else{ans.insert(pii(d.first-1,d.second));solve(noww.first,noww.second+1,d.first-1,d.second);cout<<"D";}noww=v[cc];cc++;}else{cout<<"D";ans.insert(pii(noww.first+1,noww.second));pr d=v[cc];pr e=pre[d];if(e.first+1==d.first){ans.insert(pii(d.first,d.second-1));solve(noww.first+1,noww.second,d.first,d.second-1);cout<<"R";}else{ans.insert(pii(d.first-1,d.second));solve(noww.first+1,noww.second,d.first-1,d.second);cout<<"D";}noww=v[cc];cc++;}}if(noww.first==n&&noww.second==m){cout<<endl;break;}}v.clear();cin>>c;int x,y;for(int i=1;i<=c;i++){cin>>x>>y;a[x][y]=1;ans.insert(pii(x,y));v.push_back(pii(x,y));}if(ans.size()==n+m-1){printf("! ");for(int i=1;i<v.size();i++){pr noww=v[i],pre=v[i-1];if(noww.first==pre.first+1) cout<<"D";else cout<<"R";}cout<<endl;return 0;}}
}/*
6 73
1 1
3 4
6 710
1 1
1 2
2 2
2 3
2 4
3 4
4 4
5 5
6 6
6 712
1 1
1 2
2 2
2 3
2 4
3 4
4 4
4 5
5 5
6 5
6 6
6 7*/

 

这篇关于gym102443 D.Guess the Path的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765481

相关文章

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

(4)SVG-path中的椭圆弧A(绝对)或a(相对)

1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2)rx,ry rx:椭圆的x轴半径(即水平半径) ry:椭圆的y轴半径(即垂直半径) 这两个参数好理解,就是椭圆的两条对称轴半径,相等即为圆 也可以写比例,写比例时默认用符合条件

【ArcGIS Pro实操第二期】最小成本路径(Least-cost path)原理及实操案例

ArcGIS Pro实操第一期:最小成本路径原理及实操案例 概述(Creating the least-cost path)1.1 原理介绍1.2 实现步骤1.3 应用案例 2 GIS实操2.1 工具箱简介2.1.1 成本路径(Cost path)2.1.2 成本距离(Cost distance)2.1.2 路径距离(Path Distance) 2.2 案例: 参考 概述(Cre

大数据Java基础-JAVA IO 9】java IO流 (九) Path、Paths、Files的使用

1.NIO的使用说明: >Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP。 >NIO与原来的IO同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。 >NIO将以更加高效的方式进行文件的读写操作。 >随着 JDK 7 的发布,Java对N

最短路径(Shortest Path)

单源最短路径问题 Dijkstra算法:基于递推的思想设计 未达顶点的最短路径一定是由已到达顶点的最短路径求出 所有顶点之间的最短路径,任意两个顶点之间的最短路径 Floyd算法:只是Dijkstra最短路径算法的加强,其本质还是递推

【ArcGIS Pro实操第一期】最小成本路径(Least-cost path)原理及实操案例

ArcGIS Pro实操第一期:最小成本路径原理及实操案例 概述(Creating the least-cost path)1.1 原理介绍1.2 实现步骤1.3 应用案例 2 GIS实操2.1 工具箱简介2.1.1 成本路径(Cost path)2.1.2 成本距离(Cost distance)2.1.2 路径距离(Path Distance) 2.2 案例: 参考 概述(Cre

[LeetCode] 64. Minimum Path Sum

题:https://leetcode.com/problems/minimum-path-sum/description/ 题目 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers

[LeetCode] 687. Longest Univalue Path

题:https://leetcode.com/problems/longest-univalue-path/description/ 题目 Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may no

C#从入门到精通(22)—Path类的使用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发上位机软件的过程中,有时候需要对文件的路径、文件名、扩展名进行操作,下面进行详细介绍: 1、合并路径 将盘符、文件夹、文件进行合并成最全的文件路径 st

【HDU】2807 The Shortest Path 最短路

传送门:【HDU】2807 The Shortest Path 题目分析:题目很简单,矩阵计算出两个城市的连通性,建边,然后每次询问求最短路回答(或者floyd预处理)。 当然暴力的代价是惨痛的,用堆优化+dij+输入优化最多800ms。 然后很好奇前面的是怎么跑的这么快的,看了别人写的题解才发现,原来他们是用了hash的方法将二维化为一维了,虽然可能会错误,但在出题人不是故意去卡的情