博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01迷宫
阅读量:4953 次
发布时间:2019-06-12

本文共 1855 字,大约阅读时间需要 6 分钟。

题目描述

有一个仅由数字01组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入输出格式

输入格式:

 

1行为两个正整数n,m。

下面n行,每行n个字符,字符只可能是00或者11,字符之间没有空格。

接下来m行,每行2个用空格分隔的正整数i,ji,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

 

输出格式:

 

m行,对于每个询问输出相应答案。

 

分析:这道题是迷宫题,又是要最短路程,当然是bfs了。关键是如何dfs,可以用flag数组,记录每个点是否走过,如果没走过,加入数组q,之后继续bfs

 

代码:

#include
using namespace std;char mapx[1001][1001];int flag[1001][1001],a[1000001];struct mg{ int x,y;}q[1000001];int main(){ int sx,sy,i,j,n,m,l,nx,ny,k,f,r,sum,d; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; scanf("%d %d",&n,&m); memset(a,0,sizeof(a)); memset(flag,0,sizeof(flag)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>mapx[i][j]; d=0; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(flag[i][j]==0) { d++; f=1; r=1; q[f].x=i; q[f].y=j; flag[i][j]=d; sum=1; while(f<=r) { for(k=0;k<4;k++) { nx=q[f].x+dx[k]; ny=q[f].y+dy[k]; if(flag[nx][ny]==0&&nx>=1&&nx<=n&&ny>=1&&ny<=n&&((mapx[nx][ny]=='1'&&mapx[q[f].x][q[f].y]=='0')||(mapx[nx][ny]=='0'&&mapx[q[f].x][q[f].y]=='1'))) { r++; sum++; flag[nx][ny]=d; q[r].x=nx; q[r].y=ny; } } f++; } a[d]=sum; } } } for(i=1;i<=m;i++) { cin>>sx>>sy; cout<
<

  

转载于:https://www.cnblogs.com/chen-1/p/10078027.html

你可能感兴趣的文章
边框圆角Css
查看>>
SQL 能做什么?
查看>>
java IO操作:FileInputStream,FileOutputStream,FileReader,FileWriter实例
查看>>
使用Busybox制作根文件系统
查看>>
Ubuntu候选栏乱码
查看>>
基于SSH框架的在线考勤系统开发的质量属性
查看>>
jpg图片在IE6、IE7和IE8下不显示解决办法
查看>>
delphi之模糊找图
查看>>
Javascript模块化编程的写法
查看>>
大华门禁SDK二次开发(二)-SignalR应用
查看>>
oracle 使用job定时自动重置sequence
查看>>
集成百度推送
查看>>
在项目中加入其他样式
查看>>
在使用Kettle的集群排序中 Carte的设定——(基于Windows)
查看>>
【原】iOS中KVC和KVO的区别
查看>>
OMAPL138学习----DSPLINK DEMO解析之SCALE
查看>>
IoC的基本概念
查看>>
restframework CBV试图的4种方式
查看>>
大图居中,以1920px为例
查看>>
Python3 图片转字符画
查看>>