您的位置:首页 > 其它

hdu1010

2015-07-29 17:13 316 查看
深搜+剪纸

#include <iostream>

#include <string>

#include <algorithm>

#include <cstdio>

#include <vector>

#include <map>

#include <iterator>

#include <cstring>

#include <cmath>

using namespace std;

char maze[10][10];

int flag, n, m, t;

int visit[10][10];

int dx[] = {-1,1,0,0}, dy[] = {0,0,-1,1};

int bx, by, ex, ey;

int isvalid(int x, int y) {

return x >=0 && x <n && y >=0 && y <m && !visit[x][y] && maze[x][y] != 'X';

}

void dfs(int x, int y, int time) // position (x,y) at time point(time)

{

if (flag) {return;}

if (time==t) if (x==ex && y==ey) {flag = 1; return;}

if (time>=t) {return;}

int dis = abs(x-ex) + abs(y-ey);

if (dis+time > t || (dis%2 != (t-time)%2)) {return;}

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

int nx = x + dx[i], ny = y + dy[i];

if (isvalid(nx,ny)) {

visit[nx][ny] = 1;

dfs(nx,ny,time+1);

visit[nx][ny] = 0;

}

}

}

int main() {

while (cin >> n >> m >> t && (n||m||t)) {

int mt = 1;

for (int i = 0; i < n; i++)

{

flag = 0;

memset(visit, 0, sizeof(visit));

cin >> maze[i];

for (int j = 0; j < m; j++) {

if (maze[i][j] == 'S') bx = i, by = j;

if (maze[i][j] == 'D') ex = i, ey = j;

if (maze[i][j] == '.') mt++;

}

}

if (mt < t) {cout << "NO" << endl; continue;}

mt = abs(bx-ex) + abs(by-ey);

if (mt%2 != t%2) {cout << "NO" << endl; continue;}

visit[bx][by] = 1;

dfs(bx, by, 0);

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

else {cout << "NO" << endl;}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: