当前位置: 首页 > 编程日记 > 正文

P1979 [NOIP]华容道

【问题描述】

小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次。于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间。

小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的:

  1. 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的;

  2. 有些棋子是固定的,有些棋子则是可以移动的;

  3. 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上。

游戏的目的是把某个指定位置可以活动的棋子移动到目标位置。

给定一个棋盘,游戏可以玩 q 次,当然,每次棋盘上固定的格子是不会变的, 但是棋盘上空白的格子的初始位置、 指定的可移动的棋子的初始位置和目标位置却可能不同。第 i 次

玩的时候, 空白的格子在第 EXi 行第 EYi 列,指定的可移动棋子的初始位置为第 SXi 行第 SYi列,目标位置为第 TXi 行第 TYi 列。

假设小 B 每秒钟能进行一次移动棋子的操作,而其他操作的时间都可以忽略不计。请你告诉小 B 每一次游戏所需要的最少时间,或者告诉他不可能完成游戏。

输入输出格式

输入格式:

输入文件为 puzzle.in。

第一行有 3 个整数,每两个整数之间用一个空格隔开,依次表示 n、m 和 q;

接下来的 n 行描述一个 n*m 的棋盘,每行有 m 个整数,每两个整数之间用一个空格隔开,每个整数描述棋盘上一个格子的状态,0 表示该格子上的棋子是固定的,1 表示该格子上的棋子可以移动或者该格子是空白的。接下来的 q 行,每行包含 6 个整数依次是 EXi、EYi、SXi、SYi、TXi、TYi,每两个整数之间用一个空格隔开,表示每次游戏空白格子的位置,指定棋子的初始位置和目标位置。

输出格式:

输出文件名为 puzzle.out。

输出有 q 行,每行包含 1 个整数,表示每次游戏所需要的最少时间,如果某次游戏无法完成目标则输出−1。

输入输出样例

输入样例#1: 复制
3 4 2
0 1 1 1
0 1 1 0
0 1 0 0
3 2 1 2 2 2
1 2 2 2 3 2
输出样例#1: 复制
2
-1

说明

【输入输出样例说明】

棋盘上划叉的格子是固定的,红色格子是目标位置,圆圈表示棋子,其中绿色圆圈表示目标棋子。

  1. 第一次游戏,空白格子的初始位置是 (3, 2)(图中空白所示),游戏的目标是将初始位置在(1, 2)上的棋子(图中绿色圆圈所代表的棋子)移动到目标位置(2, 2)(图中红色的格子)上。

移动过程如下:

  1. 第二次游戏,空白格子的初始位置是(1, 2)(图中空白所示),游戏的目标是将初始位置在(2, 2)上的棋子(图中绿色圆圈所示)移动到目标位置 (3, 2)上。

要将指定块移入目标位置,必须先将空白块移入目标位置,空白块要移动到目标位置,必然是从位置(2, 2)上与当前图中目标位置上的棋子交换位置,之后能与空白块交换位置的只有当前图中目标位置上的那个棋子,因此目标棋子永远无法走到它的目标位置, 游戏无

法完成。

【数据范围】

对于 30%的数据,1 ≤ n, m ≤ 10,q = 1;

对于 60%的数据,1 ≤ n, m ≤ 30,q ≤ 10;

对于 100%的数据,1 ≤ n, m ≤ 30,q ≤ 500。

题解:

  发现每个点需要移动时空格都需要在其四周,所以可以预处理出每个点到其四周的最少的步数,

  然后每次输入时,处理处空格到其四周,现将空格移到起始点周围,然后每次交换位置,再移动,

  这时就可以直接根据预处理的图进行最短路就ok了。

  1 #include<cstring>
  2 #include<cmath>
  3 #include<algorithm>
  4 #include<cstdio>
  5 #include<iostream>
  6 #include<queue>
  7 #define fzy pair<int,int>
  8 #define inf 100000007
  9 using namespace std;
 10 
 11 const int lx[4]={-1,1,0,0};
 12 const int ly[4]={0,0,-1,1};//上为0,下为1,左为2,右为3 
 13 
 14 int n,m,q;
 15 int d[4007];bool ins[4007];
 16 int p[37][37],dis[37][37];
 17 int cnt,head[4007],next[40007],rea[40007],val[40007];
 18 
 19 void add(int u,int v,int fee)
 20 {
 21     next[++cnt]=head[u];
 22     head[u]=cnt;
 23     rea[cnt]=v;
 24     val[cnt]=fee;
 25 }
 26 void bfs(int sx,int sy,int bx,int by,int flag)//sx,sy表示空格位置,bx,by表示目标棋子位置。 
 27 {
 28     queue<fzy>q;
 29     while(!q.empty()) q.pop();
 30     q.push(make_pair(sx,sy));
 31     memset(dis,0,sizeof(dis));//用来处理不经过目标点到达其身边。 
 32     dis[sx][sy]=1;
 33     while(!q.empty())
 34     {
 35         int nx=q.front().first,ny=q.front().second;q.pop();
 36         for (int i=0;i<4;i++)
 37         {
 38             int tx=nx+lx[i],ty=ny+ly[i];
 39             if (p[tx][ty]&&!dis[tx][ty]&&(tx!=bx||ty!=by))//可以走,未到过,不是目标点。 
 40             {
 41                 dis[tx][ty]=dis[nx][ny]+1;
 42                 q.push(make_pair(tx,ty));
 43             }
 44         }
 45     }
 46     if (flag>3) return;
 47     for (int i=0;i<4;i++)
 48     {
 49         int tx=bx+lx[i],ty=by+ly[i];
 50         if ((tx!=sx||ty!=sy)&&dis[tx][ty]) add(bx*120+by*4+flag,bx*120+by*4+i,dis[tx][ty]-1);//表示不经过目标点到达其身边。 
 51     }
 52     add(bx*120+by*4+flag,sx*120+sy*4+flag^1,1);//表示直接交换。 
 53 }
 54 void solve_spfa(int bx,int by)
 55 {
 56     queue<int>q;
 57     while(!q.empty()) q.pop();
 58     for (int i=0;i<4007;i++)
 59         d[i]=inf,ins[i]=0;
 60     for (int i=0;i<4;i++)
 61     {
 62         int tx=bx+lx[i],ty=by+ly[i],tn=bx*120+by*4+i;
 63         if (dis[tx][ty])
 64         {
 65             d[tn]=dis[tx][ty]-1;
 66             q.push(tn);
 67             ins[tn]=1;
 68         } 
 69     }
 70     while(!q.empty())
 71     {
 72         int now=q.front();q.pop();
 73         for (int i=head[now];i!=-1;i=next[i])
 74         {
 75             int v=rea[i],fee=val[i];
 76             if(d[now]+fee<d[v])
 77             {
 78                 d[v]=d[now]+fee;
 79                 if (!ins[v])
 80                 {
 81                     ins[v]=1;
 82                     q.push(v);
 83                 }
 84             }
 85         }
 86         ins[now]=0;
 87     }
 88  } 
 89 int main()
 90 {
 91     scanf("%d%d%d",&n,&m,&q);
 92     memset(head,-1,sizeof(head));
 93     for (int i=1;i<=n;i++)
 94         for (int j=1;j<=m;j++)
 95             scanf("%d",&p[i][j]);
 96     for (int i=1;i<=n;i++)
 97         for (int j=1;j<=m;j++)
 98         {
 99             if (!p[i][j]) continue;
100             if (p[i-1][j]) bfs(i-1,j,i,j,0);
101             if (p[i+1][j]) bfs(i+1,j,i,j,1);
102             if (p[i][j-1]) bfs(i,j-1,i,j,2);
103             if (p[i][j+1]) bfs(i,j+1,i,j,3);
104         }
105     while(q--)
106     {
107         int sx,sy,bx,by,mx,my;
108         scanf("%d%d%d%d%d%d",&sx,&sy,&bx,&by,&mx,&my);
109         if (bx==mx&&by==my)
110         {
111             puts("0");
112             continue;
113         }
114         bfs(sx,sy,bx,by,10);
115         solve_spfa(bx,by);
116         int ans=inf;
117         for (int i=0;i<4;i++)
118             ans=min(ans,d[mx*120+my*4+i]);
119         if (ans<inf) printf("%d\n",ans);
120         else puts("-1");    
121     }
122 }

转载于:https://www.cnblogs.com/fengzhiyuan/p/7747601.html

相关文章:

JS计算两个时间相差多久,相差年,月,日,小时,分钟

计算一个时间戳距离当前的时间&#xff0c;例如&#xff1a; 几年前&#xff0c;几个月前&#xff0c;几天前&#xff0c;几小时前&#xff0c;几分钟前&#xff0c;刚刚。 输出效果 代码&#xff1a; function getDistanceDay(time) {let stime new Date().getTime();let u…

replace 使用函数作为第二参数

var sToChange “The sky is red.”;var reRed /red/;var sResultText sToChange.replace(reRed, function(sMatch) { return “blue”;}); sMatch 指的是被匹配到到的对象&#xff0c; return 返回替换的对象 var reBadWords /badword|anotherbadword/gi;var sU…

如何在Visual Studio Code中编译C ++代码

PS: This was published on my Blog here. PS&#xff1a;这已发布在我的Blog 此处 。 C is a statically-typed, free-form, (usually) compiled, multi-paradigm, intermediate-level general-purpose middle-level programming language.C 是一种静态类型的&#xff0c;自由…

敏捷冲刺每日报告四(Java-Team)

第四天报告&#xff08;10.28 周六&#xff09; 团队&#xff1a;Java-Team 成员&#xff1a; 章辉宇&#xff08;284&#xff09; 吴政楠&#xff08;286&#xff09; 陈阳&#xff08;PM&#xff1a;288&#xff09; 韩华颂&#xff08;142&#xff09; 胡志权&#xff08;1…

终止forEach的循环

上代码&#xff1a; let list[1,2,3] try {list.forEach(item > {if (item1) {console.log(等于1就跳出循环)throw new Error("EndIterative");}}) } catch (e) {}

大学可以学前端开发_所有开发人员在大学中应该学习的东西

大学可以学前端开发忘记“代码行” (Forget About "Lines of Code") Source资源 As a developer, youll hear a lot of crazy, unbelievable theories about what "lines of code" signify. Believe none of them. Lines of code is a ridiculous metric …

20162325 金立清 S2 W8 C17

20162325 2017-2018-2 《程序设计与数据结构》第8周学习总结 教材学习内容概要 二叉查找树是一棵二叉树&#xff0c;对于其中的每个结点&#xff0c;左子树上的元素小于父结点的值&#xff0c;而右子树上的元素大于等于父结点的值。 最有效的二叉树是平衡的&#xff0c;所以每次…

H5画布不显示图片的问题解决

在onReady 执行 <template><view class""><canvas style"" canvas-id"myCanvas" id"myCanvas"></canvas><!-- <view class"container"><img :src"tempFilePath" /></…

javascript十六进制数字和ASCII字符之间转换

var hex"0x29";//十六进制 var charValue String.fromCharCode(hex);//生成Unicode字符 var charCode charValue.charCodeAt(0);//获取指定字符的十进制表示. var hexOri"0x"charCode.toString(16);;//将int值转换为十六进制 alert("hex:&q…

html5编写网页代码_freeCodeCamp.org的未来-从向世界传授语言到编写代码的5年经验...

html5编写网页代码freeCodeCamp went live in October 2014. In the five years since, weve done quite a bit.freeCodeCamp于2014年10月上线。在此之后的五年中&#xff0c;我们做了很多工作。 In this article, well explore:在本文中&#xff0c;我们将探讨&#xff1a; …

程序员眼中的英文单词是这样的

来源&#xff1a;Jackie Han英语中一个单词可能有很多不同的意思。很多中国开发者外语本来就不好&#xff0c;概念是往往先入为主。甚至在不清楚一般意义的情况下&#xff0c;先记住了特定环境中的意思。 转载于:https://www.cnblogs.com/agileai/p/5166982.html

linux系统无法挂载U盘

插上U盘 [ 2407.650440] usb 1-3.3: new high speed USB device number 7 using s5p-ehci [ 2407.887332] usb 1-3.3: New USB device found, idVendor0951, idProduct1666, bcdDevice0100 [ 2407.894249] usb 1-3.3: New USB device strings: Mfr1, Product2, SerialNumber3 […

小程序输入框上推页面不上推

样式问题&#xff0c;把样式去掉就行

面试:你了解中兴吗_HTTP简介:您需要了解的所有内容

面试:你了解中兴吗In this article, I will walk you through how the world wide web works at a fundamental level.在本文中&#xff0c;我将向您介绍基本的万维网工作原理。 The core technology is HTTP - Hypertext Transfer Protocol. Its the communication protocol …

img-responsive class图片响应式

在BootStrap中&#xff0c;给<img>添加 .img-responsive样式就可以实现图片响应式。1<img src"..." class"img-responsive">转载于:https://www.cnblogs.com/zouyun/p/7761393.html

小程序开发卡券

前期准备 小程序内领取卡券 1.开发者须有一个有卡券权限的公众号&#xff08;服务号&#xff09;和认证后的小程序账号&#xff1b; 2.开发者须申请一个开放平台账号&#xff0c;并将小程序和公众号绑定在同一个开放平台账号下&#xff0c;关于开放平台的介绍请参照&#xff1…

php学习之道:WSDL具体解释(三)

通过声明方式定义绑定&#xff08;binding&#xff09;属性 假设你在服务中採用SOAP binding。你能够使用JAX-WS来指定一定数量的属性binding。这些属性指定相应你在WSDL中指定的属性。某些设置。比方參数类型&#xff0c;能够约束你实现的方法。这些设置也影响声明的效用。 SO…

什么是棉绒,它如何节省您的时间?

One of the biggest challenges in software development is time. It’s something we can’t easily get more of, but linting can help us make the most out of the time we have.时间是软件开发中最大的挑战之一。 这是我们无法轻易获得的更多东西&#xff0c;但是棉绒可…

可持久化线段树(主席树)【舰娘系列】【自编题】

[pixiv] https://www.pixiv.net/member_illust.php?modemedium&illust_id60083619 向大(hei)佬(e)势力学(di)习(tou) 前段时间做了一套大佬自己出的题&#xff08;大佬竟然是个宅男2333&#xff09;&#xff0c;蒟蒻的我自然是只得了30分的暴力分:-( fleet 舰队 【题目描…

读书笔记——《黑客大曝光》(1/8)

第一部分 收集情报 案例研究 Tor系统基于洋葱路由器&#xff0c;是第二代低延迟匿名系统&#xff0c;用户可通过它在互联网上进行匿名通信。Tor网络的使用者必须在他们的系统上运行一个洋葱代理&#xff0c;这个代理允许它们在Tor网络上进行通信&#xff0c;并协商一个虚拟链路…

H5 自动播放背景音频,兼容安卓和苹果手机, ios createInnerAudioContext 无法自动播放解决

原因应该是IOS不允许自动播放音频,有两种解决方法 在main.js Vue.prototype.innerAudioContext = uni.createInnerAudioContext(); //创建播放器对象 Vue.prototype.playAudio = function(audioUrl) {console.log(播放)var innerAudioContext = Vue.prototype.innerAudioCont…

粒子耗尽 粒子滤波_如何使用粒子的强大蓝牙API

粒子耗尽 粒子滤波This post is originally from www.jaredwolff.com 这篇文章最初来自www.jaredwolff.com I was defeated. 我被打败了。 I had spent the whole night trying to get a Bluetooth Low Energy project working. It was painful. It was frustrating. I was r…

Android笔记(adb命令--reboot loader)

Android 的机器通过adb进入升级模式的方法 # adb shell # reboot loader 通过上面两个命令就进入升级模式了&#xff0c;通过工具升级就好了 为什么会写这简单的一篇呢&#xff1f;因为今天干了一件很傻很傻的事&#xff0c;特别记录下来。 业务那边今天急着要把机器寄给客户&a…

样式集(八)弹窗,规则弹窗,半透明弹窗

效果图&#xff1a; 代码&#xff1a; <view class"popupBlock" v-if"showPopupBlock"><view class"xxx"><image class"xxxImg" click"showPopupBlockfalse" mode"widthFix" src"../../stat…

typeof操作符的返回值

使用typeof操作符 对一个值使用typeof操作符可能返回下列某个字符串: 1):undefined——如果这个值未定义 2):boolean——如果这个值是布尔值 3):string——如果这个值是字符串 4):number——如果这个值是数值 5):object——如果这个值是对象或null&#xff0c;数组&#xff0c;…

定制开发软件所有权_职业所有权软件开发人员指南

定制开发软件所有权介绍 (Introduction) 您的职业正在流向大海吗&#xff1f; (Is Your Career Drifting Out To Sea?) Like a frog whos slowly being boiled in a pot but doesnt realize it, 2 years into my career I slowly came to discover that I wasnt progressing a…

转:在线框架引用 bootstrap/jq/jqmobile/css框架

bootstrap百度调用 <script src"http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js"></script><link href"http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel"stylesheet" /> 使用 Bootstrap 中文…

曲线图实现,可滚动曲线图,自定义数据

实现可以拖动的曲线图,自定义X轴数据的缩进,自定义X轴显示多少格。 效果图 数据格式,数据说明代码可见 曲线图实现 u-charts.js 可以在官网下载 <template><view class="qiun-columns"><view class=""><view class="qiu…

MongoDB 删除数据库

MongoDB 删除数据库 语法 MongoDB 删除数据库的语法格式如下&#xff1a; db.dropDatabase() 删除当前数据库&#xff0c;默认为 test&#xff0c;你可以使用 db 命令查看当前数据库名。 实例 以下实例我们删除了数据库 runoob。 首先&#xff0c;查看所有数据库&#xff1a; &…

安装meme_通过构建Meme生成器学习React

安装memeMemes are great - theyre such a fun way of describing ideas and opinions. So its no coincidence that I picked a meme generator app as the capstone project in my free React course on Scrimba. The app works by pulling a random meme image from an API …