您的位置:首页 > 其它

找朋友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。


示例输入

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: