当前位置: 首页 > news >正文

照片制作网站沅江网站设计公司

照片制作网站,沅江网站设计公司,会员卡管理系统哪里买,国外做滑板网站题目描述 \,\,\,\,\,\,\,\,\,\,你需要在一个可以上下左右移动的 nnn\times nnn 棋盘上解开一个迷宫:棋盘四周都是墙;每个方格要么是可以通过的空方格 ′0′\sf 0′0′ ,要么是不可通过的墙方格 ′1′\sf 1′1′ ;你可以沿着空方格…

题目描述

          \,\,\,\,\,\,\,\,\,\,你需要在一个可以上下左右移动的 n×nn\times nn×n 棋盘上解开一个迷宫:棋盘四周都是墙;每个方格要么是可以通过的空方格 ′0′\sf '0'′0′ ,要么是不可通过的墙方格 ′1′\sf '1'′1′ ;你可以沿着空方格通行;你已经被传送到了迷宫的左上角(第 111 行第 111 列的位置),你知道终点位于迷宫右下角(第 nnn 行第 nnn 列的位置)。
          \,\,\,\,\,\,\,\,\,\,别人都不知道的是,你是一个虫洞大师,当你所在的位置能同时看到左右两侧或上下两侧最近的那两面相对的墙时,你可以在这两面墙上开启虫洞,靠近后从一侧进入,穿越它到达另一侧。
          \,\,\,\,\,\,\,\,\,\,现在,你准备好以最短的步数离开迷宫了吗!

输入描述:

 

          \,\,\,\,\,\,\,\,\,\,第一行输入一个整数 n(2≤n≤103)n\left(2\le n \le 10^3\right)n(2≤n≤103) 代表迷宫的大小。

          \,\,\,\,\,\,\,\,\,\,此后 nnn 行,第 iii 行输入 nnn 个整数 ai,1,ai,2,…,ai,n(0≤ai,j≤1)a_{i,1},a_{i,2},\dots,a_{i,n} \left(0\le a_{i,j}\le 1\right)ai,1​,ai,2​,…,ai,n​(0≤ai,j​≤1) 代表迷宫中第 iii 行第 jjj 列这个格子中的情况,其中 000 代表空方格,111 代表墙方格。保证起点和终点不为墙壁。

输出描述:

          \,\,\,\,\,\,\,\,\,\,在一行上输出一个整数,代表离开迷宫需要的最短步数,如果无论如何都无法离开迷宫,则直接输出 −1-1−1 。

示例1

输入

复制5 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0

5
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0
1 0 0 0 0

输出

复制3

3

说明

 

          \,\,\,\,\,\,\,\,\,\,该样例示意图如下图所示。全部墙壁的位置都使用粗黑线标注。先从 (1,1)(1,1)(1,1) 向右移动一步走到 (1,2)(1,2)(1,2) ,此时可以开启一个虫洞(使用紫色箭头标注),向上移动一步到达 (5,2)(5,2)(5,2) ;此时可以开启第二个虫洞(使用红色箭头标注),向左移动一步到达 (5,5)(5,5)(5,5) 。

          \,\,\,\,\,\,\,\,\,\,

          \,\,\,\,\,\,\,\,\,\,注意,在该样例中,不能直接从 (1,1)(1,1)(1,1) 开启虫洞(使用黑色箭头标注)到达 (1,5)(1,5)(1,5) ,因为 (1,4)(1,4)(1,4) 存在两面墙遮挡了视线;不能直接从 (4,3)(4,3)(4,3) 开启虫洞(使用绿色箭头标注)到达 (1,3)(1,3)(1,3) ,因为这两面墙不是相对的。

          \,\,\,\,\,\,\,\,\,\,

示例2

输入

复制5 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

5
0 0 0 1 0
1 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 1 0

输出

复制5

5

说明

          \,\,\,\,\,\,\,\,\,\,

示例3

输入

复制2 0 1 1 0

2
0 1
1 0

输出

复制-1

-1

做法

#include<bits/stdc++.h>
using namespace std;int n;
int a[1010][1010];
int vis[1010][1010];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};struct ty{int x,y;int dis;
};int sign;
queue<ty> q;void bfs(){q.push({1,1,0});while(!q.empty()){ty tmp=q.front();q.pop();if(tmp.x==n&&tmp.y==n){cout<<tmp.dis;sign=1;return ;}if(vis[tmp.x][tmp.y]) continue;vis[tmp.x][tmp.y]=1;for(int i=0;i<4;i++){int xx=dx[i]+tmp.x;int yy=tmp.y+dy[i];if(a[xx][yy]==0){//墙壁//反方向搜,直到碰到墙壁while(a[xx-dx[i]][yy-dy[i]]) xx=xx-dx[i],yy=yy-dy[i];}if(vis[xx][yy]) continue;q.push({xx,yy,tmp.dis+1});}}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];a[i][j]^=1;//异或一下的话路变成1,墙壁变成0,四周的墙壁也是0}}bfs();if(sign==0) cout<<-1;}

我的做法错了,不知道为啥,和题解的做法不一样的就是我四周的墙壁单独处理了。然后穿墙的时候找穿越的位置也不是一个个暴力找,而是用了二分函数找。但是只过了20%,实在是找不到为什么。

#include<bits/stdc++.h>
using namespace std;int n;
int a[1010][1010];
vector<int> h[1010],l[1010];
int vis[1010][1010];
int vis1[1010][1010][4];
int dx[]={0,0,1,-1};//右左下上
int dy[]={1,-1,0,0};struct ty{int x,y;int dis;
};int sign;
queue<ty> q;void bfs(){q.push({1,1,0});while(!q.empty()){ty tmp=q.front();q.pop();vis[tmp.x][tmp.y]=1;if(tmp.x==n&&tmp.y==n){cout<<tmp.dis;sign=1;return ;}for(int i=0;i<4;i++){int xx=dx[i]+tmp.x;int yy=tmp.y+dy[i];//四周墙壁if(yy<1){//左if(h[xx].size()==0&&!vis[xx][n]) q.push({xx,n,tmp.dis+1});else if(h[xx].size()!=0&&!vis[xx][h[xx][0]-1])q.push({xx,h[xx][0]-1,tmp.dis+1});continue;}if(xx<1){//上if(l[yy].size()==0&&!vis[n][yy]) q.push({n,yy,tmp.dis+1});else if(l[yy].size()!=0&&!vis[l[yy][0]-1][yy]) q.push({l[yy][0]-1,yy,tmp.dis+1});continue;}if(yy>n){//右if(h[xx].size()==0&&!vis[xx][1]) q.push({xx,1,tmp.dis+1});else if(h[xx].size()!=0&&!vis[xx][h[xx][h[xx].size()-1]+1]) q.push({xx,h[xx][h[xx].size()-1]+1,tmp.dis+1});continue;}if(xx>n){//下if(l[yy].size()==0&&!vis[1][yy]) q.push({1,yy,tmp.dis+1});else if(l[yy].size()!=0&&!vis[l[yy][l[yy].size()-1]+1][yy]) q.push({l[yy][l[yy].size()-1]+1,yy,tmp.dis+1});continue;}if(a[xx][yy]==1){//墙壁if(vis1[xx][yy][i]) continue;vis1[xx][yy][i]=1;if(i==0) {//右if(h[xx].size()==1) q.push({xx,1,tmp.dis+1});else{int id=lower_bound(h[xx].begin(),h[xx].end(),yy)-h[xx].begin()-1;if(id!=-1) q.push({xx,h[xx][id]+1,tmp.dis+1});else q.push({xx,1,tmp.dis+1});}}if(i==1){//左if(h[xx].size()==1) q.push({xx,n,tmp.dis+1});else{int id=upper_bound(h[xx].begin(),h[xx].end(),yy)-h[xx].begin();if(id!=h[xx].size()) q.push({xx,h[xx][id]-1,tmp.dis+1});else q.push({xx,n,tmp.dis+1});}}if(i==2){//下if(l[yy].size()==1) q.push({1,yy,tmp.dis+1});else{int id=lower_bound(l[yy].begin(),l[yy].end(),xx)-l[yy].begin()-1;if(id!=-1) q.push({l[yy][id]+1,yy,tmp.dis+1});else q.push({1,yy,tmp.dis+1});}}if(i==3){//上if(l[yy].size()==1) q.push({n,yy,tmp.dis+1});else{int id=upper_bound(l[yy].begin(),l[yy].end(),yy)-l[yy].begin();if(id!=l[yy].size()) q.push({l[yy][id]-1,yy,tmp.dis+1});else q.push({n,yy,tmp.dis+1});}}}else {//正常的路if(vis[xx][yy]) continue;q.push({xx,yy,tmp.dis+1});}}}
}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];if(a[i][j]) {h[i].push_back(j);l[j].push_back(i);} }}for(int i=1;i<=n;i++){sort(l[i].begin(),l[i].end());sort(h[i].begin(),h[i].end());}bfs();if(sign==0) cout<<-1;}

http://www.yayakq.cn/news/565126/

相关文章:

  • 化妆品网站系统规划游戏网页制作代码
  • 西安有几家做网站建设银行乾县支行网站
  • 什么是速成网站天晴创艺网站建设百度小程序
  • 用php做的网站有哪些新安网站开发
  • 极速建站系统网站建设 统一标准体系
  • 外国网站免费空间申请东莞寮步搬家公司
  • 银川网站建设效果品牌互动营销案例
  • 郑州网站维护推广海南一家天涯社区
  • 中国交通建设集团英语网站网站流量在哪设置
  • 怎样开自己的网站网站源码中国有限公司
  • 网站建设公司怎么拉单淘宝客网站html
  • 厦门建设局网站2018网页设计页面设计主要技术
  • 提升学历哪种方式含金量高seo网站推广的主要目的不包括
  • 阿里云服务器可以访问国外网站吗专业做简历找什么店
  • 网站电线电话图怎么做wordpress网站静态化
  • 网站的内容更新第一次接推广多少钱合适
  • 自己做的网站怎么挂网上桂林网站制作推荐
  • 深圳网上招聘最好的网站专业外包网站建设公司
  • sentos上部署.net网站成都装修公司加盟
  • phpcms 网站忘记网站后台地址
  • 重庆平台网站建设设计对做网站有什么建议
  • 致设计网站企业网站seo优化怎么做
  • 推荐30个国外优秀的设计教程网站比较好用的免费素材网
  • 哪个网站做招聘海报比较好网站建设毕业答辩ppt模板
  • 安达市建设局网站四川公共交易资源信息网
  • 南宁网站设计和开发大赛重庆长寿网站设计公司
  • 有什么网站可以做外贸印度网站后缀
  • 新郑建设局网站7k7k小游戏大全网页版
  • 网站排名优化软件电话佛山网站建设有哪些
  • 做违法网站程序员犯法吗软件开发属于什么专业类别