在做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
为什么不用广搜用深搜