hdu diy contest 创业中心之鼠


创业中心之鼠

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秒时间。走到大门处可以选择离开或不离开。

Input

输入包含多组测试样例,请处理到文件结尾(EOF)。
每组样例第一行包含两个整数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值