杭电的1010题,该怎么处理

杭电的1010题
#include <iostream>
#include <vector>
#include <map>
#include <utility>
using std::cin;using std::cout;using std::vector;using std::map;using std::multimap;using std::make_pair;
bool yesOrNo = false;
int N, M, T;
char **p;
void dfs(int x,int y,int time){
if (time > T){
return;
}
if (p[y][x] == 'D'){
yesOrNo = true;
return;
}
p[y][x] = 'X';
if (yesOrNo == false && x + 1 < M && ((p[y][x+1] == '.')||(p[y][x+1] == 'D')))
{//说明可以往右边搜索
dfs(x + 1, y, time + 1);
}
if (yesOrNo == false && y + 1 < N && ((p[y+1][x] == '.')||(p[y+1][x] == 'D')))
{//说明可以往下搜索
dfs(x, y + 1, time + 1);
}
if (yesOrNo == false && x - 1 >= 0 && ((p[y][x-1] == '.')||(p[y][x-1] == 'D')))
{//说明可以往左边搜索
dfs(x - 1, y, time + 1);
}
if (yesOrNo == false && y - 1 >= 0 && ((p[y - 1][x] == '.') || (p[y - 1][x] == 'D')))
{//可以往上搜索
dfs(x, y - 1, time + 1);
}
}
int main()
{
while (cin >> N >> M >> T){
if (N == 0 && M == 0 && T == 0)
break;
yesOrNo = false;
int startX, startY/*, endX, endY*/;
p = new char *[N];
for (int i = 0; i < N; i++){
p[i] = new char[M];
}//生成二维数组p[M][N]
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
char ch;
cin >> ch;
if (ch == 'S'){
startX = i;
startY = j;
}
p[i][j] = ch;
}
}
dfs(startX, startY, 0);
if (yesOrNo)
cout << "YES" << std::endl;
else
cout << "NO" << std::endl;
for (int i = 0; i < N; i++){
delete[] p[i];
}
delete[] p;
}

  return 0;
}

总是通不过。。愁死了。
------解决思路----------------------
没有对程序进行剪枝,题目要求走过的地方是不能再走的。你的程序是盲目搜索,所以估计你的结果是TLE。