一道搜索题,老是超时,求解!!

呆呆的人v 2011-08-12 04:17:52
题目如下:
Description:

相信大家都看过<<Prison Break>>这部经典电影,电影中Michael Scofield是一头陷于绝境欲拼死一搏的怒狮,为了拯救了自己的手足,Michael抢劫了一家银行,因此而被与Lincoln关进同一所监狱-- 福克斯河州立监狱。作为一名建筑工程师,他对监狱的建设蓝图了如指掌,带着Lincoln逃出监狱也成为Michael入狱的唯一目的。Zqlovecs深深的被此所吸引,在一个晚上他在梦中亲身来到了这座监狱,并试图逃离这里。来到这儿他才看清了形式,这座监狱到处都是狱警,而且高高城墙是他肯定无法越过。现在他向你求救,他现在把监狱的地图通过彩信给你,请你帮他计算出最短的逃离时间,并将此路用w(way的缩写)标记出来。人命关天的事情,zqlovecs最相信你了,你千万别让他失望啊。Escaped in x minute(s).

Input:

输入有多组测试数据。 每一个测试数据第一行有两个整形数据M,N,1<=M<=1000,1<=N=1000 M和 N 分别表示监狱的 行数 和 列数 。 接下来是监狱的地图,地图中”#”表示城墙,”P”表示狱警察,”.”是安全的路,”X”表示他现在的所处位置(每组测试数据有且只有一个X)。 当M, N均 为 0 时 ,表示输入结束。

Output:

对于每组测试数据,如果他能够逃出请在第一列输出最短的逃离时间,格式You can escaped in x minute(s). 然后输出 地图,并在地图上将相应的逃生之路用“w“标记出来。假定只有唯一出路,也就是不可能有时间相同的多条逃生路线 如果他不能顺利逃脱,那么请输出:My good friend, may God bless you! 每组输出结果之间空一行。

Example Input:

5 5
#####
#..X#
#.P.#
#..P#
#.###
4 4
#P##
#..#
#X.#
####
0 0
Example Output:

You can escaped in 6 minute(s).
#####
#wwX#
#wP.#
#w.P#
#w###

My good friend, may God bless you!
链接:http://acm.nuc.edu.cn/OJ/problem.php?pid=1838
我想了很久,不懂怎么优化,请各位大牛赐教!!!
#include "stdio.h"
#include "string.h"
#define M 1012
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int BFS (int x,int y);
char map[M][M];
int count,n,m;
int main ()
{
int i,j,k,flag;
int x,y;
char c[M];
while (scanf ("%d %d",&n,&m))
{
if (m == 0&& n == 0)
break;
count = 0;
flag = 0;
getchar ();
for (i = 1;i <= n;i ++)
{
gets(c);
k = 0;
j = 1;
while (c[k] != '\0')
{
map[i][j++] = c[k++];
}
memset (c,'\0',sizeof(c));
}
for (i = 1;i <= n;i ++)
{
for (j = 1;j <= m;j ++)
{
if (map[i][j] == 'X')
{
x = i;
y = j;
flag = 1;
break;
}
}
if (flag) break;
}
if (BFS(x,y) == 1)
{
printf ("You can escaped in %d minute(s).\n",count);
for (i = 1;i <= n;i ++)
{
for (j = 1;j <= m;j ++)
printf ("%c",map[i][j]);
printf ("\n");
}
}
else
printf ("My good friend, may God bless you!\n");
memset (map,'\0',sizeof(map));
printf ("\n");
}
return 0;
}

int BFS (int x,int y)
{
int X,Y,i,flag;
if (x<1||y<1||x>n||y>m)
return 1;
if (map[x][y] == '#')
return 0;
map[x][y] = '*';
flag = 0;
for (i = 0;i < 4;i ++)
{
X = x + dx[i];
Y = y + dy[i];
if (map[X][Y] == '#'||map[X][Y]== '*'||map[X][Y] == 'P') continue;
else if (BFS(X,Y) == 1) flag = 1;
}
if (flag == 0)
map[x][y] = '.';
else
{
map[x][y] = 'w';
count ++;
}
return flag;
}
...全文
319 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
呆呆的人v 2011-10-30
  • 打赏
  • 举报
回复
重写了一个BFS,但却wrong answer了
求解!!!
#include "stdio.h"
#include "string.h"
#define M 1001
#define N 1000001
int dx[] = {-1,0,1,0};
int dy[] = {0,-1,0,1};
int flow;
struct back
{
int x0,y0,n;

}b[N];
char map[M][M];
int map1[M][M];

int BFS (int X,int Y,int m,int n)
{
int front = 0,num = 0;
int rear = 0;
b[0].x0 = X;
b[0].y0 = Y;
map1[X][Y] = 1;
while (front <= rear)
{
X = b[front].x0;
Y = b[front].y0;
map[X][Y] = '*';

for (int i = 0;i < 4;i ++)
{
int x = X + dx[i];
int y = Y + dy[i];
if (x < 1|| y < 1||x>m||y>n)
{
if (num == 0)
return -1;
else
return front;

}

else if (map[x][y] == '.'&&map1[x][y] == 0)
{
rear ++;
b[rear].x0 = x;
b[rear].y0 = y;
b[rear].n = front;
map1[x][y] = 1;

num = 1;

}
}
front ++;
}
return 0;
}

int main ()
{
int i,j,k,m,n,x,y,t;
long count;
char str[M];
while (scanf ("%d %d",&m,&n))
{
if (m==0&&n==0)
break;
memset (map1,0,sizeof(map1));
getchar ();
count = 1;
for (i = 1;i <= m;i ++)
{
k = 0;
j = 1;
gets (str);
while (str[k] != '\0')
{
map[i][j] = str[k++];
if (map[i][j] == 'X')
{
x = i;
y = j;
}
j ++;
}
memset (str,'\0',sizeof (str));
}
t = BFS(x,y,m,n);

map[x][y] = 'X';
if (t == -1)
{

printf ("You can escaped in 1 minute(s).\n");
for (i = 1;i <= m;i ++)
{
for (j = 1;j <= n;j ++)
{
printf ("%c",map[i][j]);
}
printf ("\n");
}
printf ("\n");
}
else if (t)
{


while (t)
{
map[b[t].x0][b[t].y0] = 'w';
t = b[t].n;
count ++;
}
printf ("You can escaped in %ld minute(s).\n",count);
for (i = 1;i <= m;i ++)
{
for (j = 1;j <= n;j ++)
{
if (map[i][j] == '*')
printf (".");
else
printf ("%c",map[i][j]);
}
printf ("\n");
}
printf ("\n");
}
else
{
printf ("My good friend, may God bless you!\n\n");

}
memset (map,'\0',sizeof(map));
memset (map1,0,sizeof(map1));
t = 0;
}
return 0;
}


呆呆的人v 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yzx714 的回复:]

引用 5 楼 flylee 的回复:

瞟了一眼,你这根本就不是bfs,是dfs
楼主你忽悠人啊……没看代码都被您忽悠了……
[/Quote] 对,是DFS
yzx714 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 flylee 的回复:]

瞟了一眼,你这根本就不是bfs,是dfs
[/Quote]楼主你忽悠人啊……没看代码都被您忽悠了……
flylee 2011-08-13
  • 打赏
  • 举报
回复
瞟了一眼,你这根本就不是bfs,是dfs
呆呆的人v 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 babilife 的回复:]

越狱~~
[/Quote]你也做过??
yzx714 2011-08-12
  • 打赏
  • 举报
回复
最讨厌BFS了,长
至善者善之敌 2011-08-12
  • 打赏
  • 举报
回复
越狱~~
yzx714 2011-08-12
  • 打赏
  • 举报
回复
直接BFS超时了?先看下代码本身有没有问题,看看TLE了多少
1.改为从所有出口多源BFS看下
2.不行就改为双向BFS看下
3.还不行就用曼哈顿距离来A*,就不信了
本套餐将包括两个重磅性的课程与一个赠送学习的课程,分别为SpringBoot实战视频教程与RabbitMQ实战教程跟SSM整合开发之poi导入导出Excel。目的是为了让各位小伙伴可以从零基础一步一个脚印学习微服务项目的开发,特别是SpringBoot项目的开发,之后会进入第二个课程:RabbitMQ的实战,即消息中间件在实际项目或者系统中各种业务模块的实战并解决一些常见的典型的问!核心的知识点分别包括 一、SpringBoot实战历程课程 (1)SpringBoot实战应用场景的介绍与代码实战 (2)发送邮件服务、上传下载文件服务、Poi导入导出Excel (3)单模块与多模块项目构建、项目部署打包、日志、多环境配置、lombok、validator以及mybatis整合实战跟多数据源实战 (4)Redis缓存中间件的实战与缓存雪崩跟缓存穿透等问的解决实战 (5)RabbitMQ消息中间件在业务模块异步解耦、通信、消息确认机制以及并发量配置等的实战 二、RabbitMQ实战教程课程 (1)RabbitMQ的官网权威技术手册拜读,认识并理解各大专有名词,如队列,交换机,路由,死信队列,消息确认机制等等 (2)RabbitMQ在业务服务模块之间的异步解耦通信实战,如异步记录日志与发送邮件等 (3)商城系统抢单高并发情况下RabbitMQ的限流作用与代码实战 (4)消息确认机制与并发量配置并用来实战商城用户下单 (5)死信队列深入讲解与DLX,DLK,TTL等概念的讲解并用来实战 “支付系统用户下单后支付超时而失效其下单记录”实战 详情,各位小伙伴可以查看两个课程的目录。相信学完该套餐相关课程后,你的实战能力将大大提升!涨薪将不再遥遥无期! 最后,赠送的SSM整合开发之POI导入导出Excel目的是为了让各位小伙伴也可以学习Spring+SpringMVC+Mybatis整合开发的项目,让大家一对比SpringBoot与SPring的项目开发流程以及复杂程度!!! 相信学完之后,你会对SpringBoot爱不释手!!

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧