HDU-1010的剪枝问题的困惑

在做HDU-1010的时候,真的很无奈很痛苦,永远TLE,我在网上也查了很久,我的代码
几乎把网上所有说的剪枝方法都用上了,但还是TLE
附上题目链接:

再附上我的代码:

 #include<iostream>
#include<queue>
#include<cstring>
#include<cmath>

using namespace std;

int n, m, t, br, bc, er, ec, flag, wall;
char maze[10][10],vis[10][10];

int dirr[4] = { -1,1,0,0 };
int dirc[4] = { 0,0,-1,1 };

inline bool checkr(int r)
{
    return  r >= 0 && r < n;
}

inline bool checkc(int c)
{
    return c >= 0 && c < m;
}

/*int solve(int r, int c)     //BFS
{
    queue<pair<int, int> >q;
    q.push(make_pair(r, c));
    while (!q.empty()) {
        pair<int, int> x = q.front(); q.pop();

        for (int i = 0; i < 4; ++i) {
            if (checkr(x.first, i) && checkc(x.second, i)) {
                int newr = x.first + dirr[i], newc = x.second + dirc[i];
                if (maze[newr][newc] != 'X') {
                    if (!time[newr][newc] && maze[newr][newc]!='S') {
                        time[newr][newc] = time[x.first][x.second] + 1;
                        q.push(make_pair(newr, newc));
                    }
                    if (maze[newr][newc] == 'D') {
                        return time[newr][newc];
                    }
                }
            }
        }

    }
}*/

void solve(int r, int c, int t)
{

    int tem = t - abs(er - r) - abs(ec - c);
//  cout << r << " " << c << " " << t << endl;
//  if (((r + c) % 2 + t % 2) != (er + ec) % 2) return;

    if (tem < 0 || tem & 1) return;

    if (t < er - r + ec - c) return;    //两种剪枝

    if (flag) return;

//  cout << r << " " << c << endl;

    --t;
    for (int i = 0; i < 4; ++i) {
        int newr = r + dirr[i], newc = c + dirc[i]; 
        if (checkr(newr) && checkc(newc) && maze[newr][newc] != 'X' && !vis[newr][newc]) {

            if (newr == er && newc == ec && t != 0) continue;

            if (t >= 1) {

//              cout << "ok" << endl;

                vis[newr][newc] == 1;
                solve(newr, newc, t);
                if (flag) {
                    return;
                }
                vis[newr][newc] == 0;
            }
            if (t == 0) {
                if (newr==er && newc==ec) {
                    flag = 1;
                    break;
                }
            }
        }
    }

}

int main()
{
    cin >> n >> m >> t;
    while (n != 0) {
        memset(maze, 0, sizeof(maze)); memset(vis, 0, sizeof(vis)); flag = 0; wall = 0;

        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                cin >> maze[i][j];
                if (maze[i][j] == 'S') {
                    br = i; bc = j;
                }
                if (maze[i][j] == 'D') {
                    er = i; ec = j;
                }
                if (maze[i][j] == 'X') {
                    ++wall;
                }
            }
        }


//      cout << er << " " << ec << endl;

        if (n*m - wall <= t) {
            cout << "NO" << endl;
            cin >> n >> m >> t;
            continue;
        }


        vis[br][bc] = 1;
        solve(br, bc, t);
//      cout << res << endl;

        if (flag) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }

        cin >> n >> m >> t;
    }
    return 0;
}


希望各位能指点一二,谢谢了

http://blog.csdn.net/zl_130/article/details/47279549

为什么不用广搜用深搜