您的位置:首页 > 其它

hdu1010 Tempter of the Bone

2015-11-05 21:22 411 查看
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <iostream>

using namespace std;

int di, dj, N, M, T;

char map[9][9];

char dir[4][2] = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};

bool escape;

void DFS(int si, int sj, int cnt)

{

int i, temp;

if(si <= 0 || si > N || sj <= 0 || sj > M) return;

if(si == di && sj == dj && cnt == T)

{

escape = 1;

return;

}

temp = (T - cnt) - abs(si - di) - abs(sj - dj);

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

for(i = 0; i < 4; i++)

{

if(map[si + dir[i][0]][sj + dir[i][1]] != 'X')

{

map[si + dir[i][0]][sj + dir[i][1]] = 'X';

DFS(si + dir[i][0], sj + dir[i][1], cnt+1);

if(escape) return;

map[si + dir[i][0]][sj + dir[i][1]] = '.';

}

}

return;

}

int main()

{

int si, sj, i, j;

while(cin >> N >> M >> T && (N!=0) && (M!=0) && (T!=0))

{

int wall = 0;

for(i = 1; i <= N; i++)

for(j = 1; j <= M; j++)

{

cin >> map[i][j];

if(map[i][j] == 'S') {si = i; sj = j; }

else if(map[i][j] == 'D') {di = i; dj = j; }

else if(map[i][j] == 'X') wall++;

}

if(N * M - wall <= T)

{

cout << "NO" <<endl;

continue;

}

escape = 0;

map[si][sj] = 'X';

DFS(si, sj, 0);

if(escape) cout << "YES" <<endl;

else cout << "NO" <<endl;

}

return 0;

}

心得:原文地址:http://acm.hdu.edu.cn/forum/read.php?tid=6158,刚接触剪枝,奇偶剪枝+路径剪枝(是不是有点高大上,其实就那样),什么也不说,就当学习了。不过,输入map[i][j]的时候用scanf会报错,这是为什么呢?。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: