肉骨頭的誘惑(求助)

問題 L: 肉骨頭的誘惑

題目描述

小狗在一個古老的迷宮中發現了一根骨頭,這使他非常着迷。但是,當他撿起它時,迷宮開始搖晃,小狗可以感覺到地面下沉。他意識到骨頭是一個陷阱,他拼命試圖擺脫這個迷宮。迷宮是一個矩形,大小爲N×M。迷宮中有一扇門。剛開始時,門是關閉的,它將在第T秒打開一小段時間(少於1秒)。因此,小狗必須在第T秒精確到達門。每秒鐘,他可以將一個塊移動到上,下,左和右相鄰的塊之一。一旦他進入一個塊,該塊的地面將開始下沉並在下一秒消失。他不能在一個塊停留超過一秒鐘,也不能走到曾經走過的塊區上。可憐的小狗可以生存嗎?請幫助他。

輸入

輸入包含多個測試用例。每個測試用例的第一行包含三個整數N,M和T(1 <N,M <= 7; 0 <T <50),表示迷宮的大小和門打開的時間,分別。接下來的N行給出迷宮的佈局,每行包含M個字符。角色是以下字符之一:'X':小狗無法進入的牆塊;'S':小狗的起點;'D':門;或“.”:空白塊。輸入以三個0終止。該測試用例將不被處理。

輸出

對於每個測試用例,如果小狗可以存活,則在一行中輸出“YES”,否則輸出“NO”。

樣例輸入

4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0

樣例輸出

NO
YES

這道題我暴交了15次,結果都是tle50分,各位大佬幫忙看看

代碼:

#include <bits/stdc++.h>
#define MAXN 10
using namespace std;
int n,m,t;
int flag;
char str[MAXN][MAXN];
int zb[4][2] = {{0,-1},{0,1},{-1,0},{1,0}};
void dfs(int bx,int by,int dx,int dy,int tim)
{
	if(bx > n || by > m || bx <= 0 || by <= 0) return;
	if(bx == dx && by == dy && tim == t)
	{
		flag = 1;
		return;
	}
	for(int i=0 ; i<4 ; ++i)
	{
		if(str[bx+zb[i][0]][by+zb[i][1]]!='X')
		{
			str[bx+zb[i][0]][by+zb[i][1]] = 'X';		
		    dfs(bx+zb[i][0],by+zb[i][1],dx,dy,tim+1);
		    if(flag) return;				
		    str[bx+zb[i][0]][by+zb[i][1]] = '.';		
		}
	}
	return;
}
int main()
{
	int dx,dy,bx,by;				
	while(scanf("%d%d%d", &n, &m, &t))	
	{
		int wall_sum = 0;	
		getchar();	
		if(n == 0 && m == 0 && t == 0) break;	
		for(int i = 1; i <= n; ++i)
		{
			for(int j = 1; j <= m; ++j)
			{
				scanf("%c", &str[i][j]);
				if(str[i][j] == 'S'){bx = i;by = j;}
				else if(str[i][j] == 'D'){dx = i;dy = j;}
				else if(str[i][j] == 'X') wall_sum++;
			}
			getchar();	
		}	
		flag = 0;
		if(n * m <= t + wall_sum){printf("NO\n");continue;}
		str[bx][by] = 'X';
		dfs(bx,by,dx,dy,0);	
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
}

 

發佈了57 篇原創文章 · 獲贊 12 · 訪問量 4835
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章