nyoj 58 最小步数(回溯算法应用)
2015-08-04 22:14
323 查看
最少步数
时间限制:3000 ms | 内存限制:65535 KB难度:4
描述
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出输出最少走几步。
样例输入
2 3 1 5 7 3 1 6 7
样例输出
12 11
AC码
#include<stdio.h> #define M 0Xfffffff int min,x,y,ex,ey,n; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int map[9][9]= { 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; //递归一般都可以打表 void dfs(int x,int y,int c) { if(x==ex&&y==ey) { if(c<min) //不断让min为最小成功的步数 { min=c; } return; } for(int i=0 ; i<4 ; i++) //4个方向进行搜索 { int nx=x+dx[i]; int ny=y+dy[i]; if(map[nx][ny]==0) { map[nx][ny]=1; dfs(nx,ny,c+1); map[nx][ny]=0; //向后退一步的时候必须把路恢复原样 } } } int main() { scanf("%d",&n); while(n--) { scanf("%d%d%d%d",&x,&y,&ex,&ey); int c=0; //c记录步数 min=M; //先让最小步数等于一个无穷大 dfs(x,y,c); map[x][y]=0; //因为要输入好多组数据,每组数据结束后都要把道路恢复原样 printf("%d\n",min); } }
相关文章推荐
- 冒泡排序
- 十一讲,浮点数,小数点前后分别显示
- 通过HTML和CSS隐藏和显示元素的方法大全
- AndroidStudio Tips
- CSRF 攻击原理和防御方法
- 创建dblink遇到一系列问题
- 2015 Multi-University Training Contest 5 1002
- List View
- 高效 MacBook 工作环境配置
- Docker源码分析(四):Docker Daemon之NewDaemon实现
- iOS中的字符串操作大全
- C 结构体的用法总结
- angularJS--apply() 、digest()和watch()方法
- angularJS--apply() 、digest()和watch()方法
- mybatis 源码系列 组件之 reflection
- pl/sql develop Command Windows 命令
- android Looper Handler机制
- POJ - 3660 - Cow Contest (floyd求传递闭包)
- hdu 5349 MZL's simple problem
- Cubieboard 3编译驱动教程