相约KFC TLE0

相约KFC

XJOI - 题目ID:15703必做题100分

最新提交:

Time Limit Exceeded

0 分

历史最高:

Time Limit Exceeded

0 分

时间限制: 200ms

空间限制: 131072kB

题目描述

暑假即将到来,鱼大大和羊大大计划吃肯德基。他们在计划中在某一天选择了某一个肯德基吃午饭。

到了约定的日子,鱼大大和羊大大都是9点出发,向KFC前进,问他们两能否在中午12点之前到达约定的KFC?如果可以,那么他们最少花费多少分钟就能在KFC相约?

约定:

时间计算:起点到终点的距离为时间,即走1单位的距离,鱼大大和羊大大都要花费1分钟的时间。

‘@’ 是鱼大大的位置,‘#’ 是障碍,‘F’ 表示KFC,‘&’ 表示羊大大的位置。

‘.’,‘F’,‘@’ 和 ‘&’,这些位置都可以通过。

输入格式

第一行包含两个整数 n 和 m。

接下来的 n 行,每行输入 m 个字符来表示地图。(1 ≤ n ≤ m ≤ 200)

输出格式

如果能找到一条可行的路径并在在12点之前到达KFC,输出花费的最少时间,否则输出 “Meeting cancelled”(两人无法在12点之前相约在此KFC)。

样例

Input 1

4 4 @.#. … .#… F…&

Output 1

3

数据范围

见题面

脑袋短路了,代码见下

#include<bits/stdc++.h>
using namespace std;

int n,m,o[2]={40005,40005},dx[4]{0,1,0,-1},dy[4]={1,0,-1,0};
bool h[205][205];
char s[205][205];
void fo(int x,int y,int g1,int g2,int l,int v){
	if(x == g1 && y == g2){
		if(o[v]>l){
			o[v] = l;
		}
		return;
	}
	for(int i = 0; i<4; i++){
		int s1=dx[i]+x,s2=dy[i]+y;
		if(s1<n && s1>=0 && s2<m && s2>=0 && h[s1][s2] == false && s[s1][s2] != '#'){
			h[s1][s2] = true;
			fo(s1,s2,g1,g2,l+1,v);
			h[s1][s2] = false;
		}
	}
}

int main(){
	cin>>n>>m;
	int a,b,c,d,e,f;
	for(int i = 0; i<n; i++){
		for(int j = 0; j<m; j++){
			cin>>s[i][j];
			if(s[i][j] == '@'){
				a = i;
				b = j;
			}else if(s[i][j] == '&'){
				c = i;
				d = j;
			}else if(s[i][j] == 'F'){
				e = i;
				f = j;
			}
		}
	}
	fo(a,b,e,f,0,0);
	memset(h,false,sizeof(h));
	fo(c,d,e,f,0,1);
	if(o[0]<180 && o[1]<180){
		cout<<max(o[0],o[1]);
	}
	return 0;
}
3 个赞

广搜试试?

3 个赞

dfs肯定超时啊,得用bfs

2 个赞

关键代码

void bfs(int sx, int sy) {
	int vis[205][205] = {};
	queue <node> q;
	vis[sx][sy] = 1;
	q.push(node {sx, sy, 0});
	while (!q.empty()) {
		node now = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int xx = now.x + dx[i], yy = now.y + dy[i];
			if (mapa[xx][yy] == 'F') {
				a = 1;
				sum = now.step + 1;
				return;
			}
			if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && vis[xx][yy] == 0 && mapa[xx][yy] == '.') {
				vis[xx][yy] = 1;
				q.push(node {xx, yy, now.step + 1});
			}
		}
	}
}
3 个赞

bfs和adds之间有什么区别(拜托详细一点)

2 个赞

谢谢,我看懂了

打错了(尴尬)

1 个赞

哈哈哈哈哈,好吧