問題 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");
}
}