Oliver的救援(广搜练习题)
来源:互联网 发布:python http 断点续传 编辑:程序博客网 时间:2024/05/16 10:01
题目大意
一个n*n的01矩阵,0表示可以走,1表示不可以走,只可以上下左右走。求从(a,b)走到(c,d)最少的格子数。
样例输入
501111001111000111101111001 1 5 5
样例输出
9
思路
广搜
C++代码
#include<cstdio>#include<cstring>#define sr c=getchar()#define input read()#define pd (c<'0'||c>'9')#define fk f=f*10+c-48#define ps if (c=='-') d=-1using namespace std;int n;char c;bool a[1005][1005];int father[1000001],state[1000001][4];int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};//四个方向扩展int x1,x2,y1,y2;int read(){int d=1,f=0;char c;while (sr,pd) ps;fk;while (sr,!pd) fk;return d*f;}void bfs(){int head=0,tail=1;state[1][3]=1;father[1]=0;a[1][1]=1;do{head++;for (int i=0;i<4;i++) { int x=state[head][1]+dx[i]; int y=state[head][2]+dy[i]; if (x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]==0)//判断是否超出矩阵和能否走 { tail++; father[tail]=head; state[tail][1]=x;//存横坐标 state[tail][2]=y;//存纵坐标 state[tail][3]=state[head][3]+1;//到这个格子走的格子数 a[x][y]=1;//封路 if(x==x2&&y==y2)//到达目标位置 { printf("%d",state[head][3]);//输出 return; } } }}while(head<tail);}int main(){ scanf("%d\n",&n);char c; for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { c=getchar(); if (c=='1') a[i][j]=true; } c=getchar(); } state[1][1]=input;state[1][2]=input;x2=input;y2=input; bfs();}
阅读全文
0 0
- Oliver的救援(广搜练习题)
- Oliver的救援(广度优先搜索)
- 【BFS】Oliver的救援
- Oliver的救援
- oliver的救援
- SSL_2278 Oliver的救援
- Oliver的救援
- Oliver的救援--SSL 2278
- Oliver的救援pascal程序
- SSL P2278 Oliver的救援
- BFS(广搜) 救援
- SSL P2278 Oliver的救援 题目
- SSL JudgeOnline 2278——Oliver的救援
- 细胞问题(广搜练习题)
- 1786 麻将游戏(广搜练习题) C++
- 如何成为游戏行业的图形程序员(Oliver Franzke )
- Vijos P1577可怜的Oliver
- 武士风度的牛(广搜)
- capstone训练营2017-12-7
- Matlab读取视频并处理成帧保存
- QT控件大全 十一 QLock
- 解决Eclipse每次修改完代码后需要先Clean代码才能生效问题
- Mybatis mapper层No enum constant org.apache.ibatis.type.JdbcType.date
- Oliver的救援(广搜练习题)
- C++对象指针浅拷贝和深拷贝
- 欢迎使用CSDN-markdown编辑器
- 郑少国收藏的web前端网站
- Erwin 字段加注释
- Tensorflow入门之 前言
- linux上jdk的安装配置
- 【51nod】-1001 数组中和等于K的数对(思维)
- Python实现Pat 1004. Counting Leaves (30)