创业中心之鼠
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 52 Accepted Submission(s) : 14
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
创业中心有只又肥又大的老鼠,虎头虎脑十分可爱,在创业中心集训的同学都非常喜欢它,每次见到它都要喂它吃的。但小家伙总是在夜深人静的时候才出来,所以要想喂它就得等到很晚,雷爷每天走得最晚,所以喂老鼠这个艰巨的任务就交给他了。雷爷很忙,他希望花最短的时间走到老鼠那儿再走到门口,请你帮他算一下最短需要多少时间。
创业中心有桌椅、墙壁等障碍物,用”X”表示;空地用”.”表示;雷爷的出发点为”S”;创业中心的门为”D”;老鼠用”M”表示(只有一只老鼠)。
注:雷爷只能向“前后左右”四个方向移动,走过的路可以重复走,当某一时刻雷爷和老鼠处于同一点时,雷爷才可以喂老鼠,并消耗1秒时间。走到大门处可以选择离开或不离开。

创业中心有桌椅、墙壁等障碍物,用”X”表示;空地用”.”表示;雷爷的出发点为”S”;创业中心的门为”D”;老鼠用”M”表示(只有一只老鼠)。
注:雷爷只能向“前后左右”四个方向移动,走过的路可以重复走,当某一时刻雷爷和老鼠处于同一点时,雷爷才可以喂老鼠,并消耗1秒时间。走到大门处可以选择离开或不离开。
Input
输入包含多组测试样例,请处理到文件结尾(EOF)。
每组样例第一行包含两个整数M、N(1 <= M,N <= 100),代表创业中心大小为M×N,接下来包括M行,每行N个字符,代表创业中心内部布局。
样例保证雷爷可以顺利完成任务。
每组样例第一行包含两个整数M、N(1 <= M,N <= 100),代表创业中心大小为M×N,接下来包括M行,每行N个字符,代表创业中心内部布局。
样例保证雷爷可以顺利完成任务。
Output
输出完成任务所用的最短时间(秒),每个输出占一行。
Sample Input
4 4 .D.. XXX. ..M. S.XX 4 4 ..D. X.XX ..M. S.XX
Sample Output
9 8
一个简单的bfs的问题,由于估算错误把Q的大小开为100了,直接RE了,后来发现是100*100不是100个节点,唉,看题不仔细哇。
#include <stdio.h>
#include <string.h>
char map[110][110],map_cpy[110][110];
struct Point{
int y,x;
}Q[10100];
int rear,head,step,add_step_flag;
int N,M;
void bfs(struct Point begin,char ch){
int dir[][2]={
1,0,0,1,-1,0,0,-1
};
int temp_x,temp_y;
for(int i = 0;i< 4;++i){
temp_x = begin.x + dir[i][0];
temp_y = begin.y + dir[i][1];
if(map[temp_y][temp_x] == ch){
++step;
return ;
}
if(temp_x >= 0&&temp_x <N&&temp_y >= 0&&temp_y <M&&map[temp_y][temp_x]!='X'){
map[temp_y][temp_x] = 'X';
Q[rear].x= temp_x;
Q[rear].y= temp_y;
++rear;
}
}
++head;
if(head == add_step_flag){
++step;
add_step_flag = rear;
}
if(head == rear){
return ;
}
bfs(Q[head],ch);
}
int main(int argc, char *argv[])
{
//FILE *fp;
//fp = freopen("in1.txt","r",stdin);
int break_flag;
int sum;
while(~scanf("%d%d",&M,&N)){
for(int i = 0; i < M;++i){
scanf("%s",map[i]);
strcpy(map_cpy[i],map[i]);
}
break_flag = 0;
for(int i = 0; i < M; ++i){
for(int j = 0; j < N; ++j){
if(map[i][j] == 'S'){
Q[0].x = j;
Q[0].y = i;
map[i][j] = 'X';
break_flag = 1;
break;
}
}
if(break_flag){
break;
}
}
head = 0;
rear = 1;
add_step_flag = 1;
step = 0;
bfs(Q[0],'M');
sum = step + 1;
for(int i = 0; i < M; ++i)
strcpy(map[i],map_cpy[i]);
break_flag = 0;
for(int i = 0; i < M; ++i){
for(int j = 0; j < N; ++j){
if(map[i][j] == 'M'){
Q[0].x = j;
Q[0].y = i;
map[i][j] = 'X';
break_flag = 1;
break;
}
}
if(break_flag){
break;
}
}
head = 0;
rear = 1;
add_step_flag = 1;
step = 0;
bfs(Q[0],'D');
sum += step;
printf("%d\n",sum);
}
return 0;
}