找朋友SDUT(2779)
2016-03-30 22:36
309 查看
一开始用dfs做的 超时了然后又用了bfs才A掉的
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。
多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。
若X可以到达Y的家,输出最少时间,否则输出 -1。
这是BFS的代码
下面为DFS的代码 Tle 啊
找朋友
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。
输入
多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。
输出
若X可以到达Y的家,输出最少时间,否则输出 -1。
示例输入
3 3 X#Y *** #*# 3 3 X#Y *#* #*#
示例输出
4 -1
提示
这是BFS的代码#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { int x, y, z; }Q[410],ans; char Map[20][20]; int book[20][20]; int x1,x2,y1,y2; int dx[] = {0,0,-1,1}; int dy[] = {1,-1,0,0}; int bfs(int n, int m) { memset(book,0,sizeof(book)); Q[0] = {x1,y1,0}; book[x1][y1] = 1; int head =0, tail = 1; while(head < tail){ ans = Q[head]; head++; if(ans.x==x2&&ans.y==y2){ return ans.z; } for(int i = 0;i < 4;i++){ int nowx = ans.x+dx[i]; int nowy = ans.y+dy[i]; if(nowx>=1&&nowx<=n&&nowy>=1&&nowy<=m &&Map[nowx][nowy]!='#'&&!book[nowx][nowy]){ Q[tail++] = {nowx,nowy,ans.z+1}; book[nowx][nowy] = 1; } } } return -1; } int main() { int n, m; while(~scanf("%d %d", &n, &m)){ int i, j; for(i = 1;i<=n;i++){ scanf("%s", Map[i]+1); for(j = 1;j <= m;j++){ if(Map[i][j] == 'X'){ x1 = i; y1 = j; } if(Map[i][j] == 'Y'){ x2 = i; y2 = j; } } } printf("%d\n", bfs(n,m)); } return 0; }这是可以A掉的
下面为DFS的代码 Tle 啊
#include <stdio.h> #include <string.h> #include <stdlib.h> int startx,starty; int n, m; char Map[20][20]; int book[20][20]; int dx[] = {-1,1,0,0}; int dy[] = {0,0,-1,1}; int tx,ty; int ans; void dfs(int x, int y, int step) { if(x==tx && y== ty){ if(step < ans){ ans = step; } return; } int nowx, nowy; int i; for(i =0;i < 4;i++){ nowx = x+dx[i]; nowy = y+dy[i]; if(nowx>=1&&nowx<=n&&nowy>=1&&nowy<=m&& Map[nowx][nowy]!='#'&&!book[nowx][nowy]){ book[nowx][nowy] = 1; dfs(nowx,nowy,step+1); book[nowx][nowy] =0; } } } int main() { while(~scanf("%d %d", &n, &m)){ ans = 0x3f3f3f3f; memset(book,0,sizeof(book)); int i,j; for(i = 1;i <=n;i++){ scanf("%s", Map[i]+1); for(j = 1;j <= m;j++){ if(Map[i][j] == 'X'){ startx = i; starty = j; } if(Map[i][j] == 'Y'){ tx = i; ty = j; } } } book[startx][starty] = 1; dfs(startx, starty,0); if(ans == 0x3f3f3f3f){ printf("-1\n"); }else { printf("%d\n", ans); } } return 0; }
相关文章推荐
- View的draw过程源码分析
- TWinControl的消息覆盖函数大全(41个WM_函数和31个CM_函数,它的WndProc就处理鼠标(转发)、键盘(取消拖动)、焦点、和WM_NCHITTEST一共4类消息)
- #java读书笔记#多线程1
- 《JAVA源码分析》:Thread
- 2016 从明天才开始
- CSS书写规范、顺序和命名规则
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS序+BFS+二分)
- MySQL存储日志并使用Loganalyzer作为前端展示 推荐
- mysql创建table时出错 ERROR 1067 (42000): Invalid default value for ' '
- Android studio编译NDK
- 链表的基本操作
- Java的类属性和实例属性
- Java程序员从笨鸟到菜鸟之(十一)多线程讲解
- 文本聚类算法分析
- Web 前端优化最佳实践之 Mobile(iPhone) 篇
- android记录登录状态【新浪云搬运】
- 【转载】程序员有哪些电脑技能让外行感到神奇?
- HDU 5115:Dire Wolf 区间dp
- stm32 串口中断
- 双击C/C++的debug下*.exe一闪而过的解决方案(初学者适用版)