hdoj 1010 Tempter of the Bone

来源:互联网 发布:mac散热声音大 编辑:程序博客网 时间:2024/06/05 12:39

http://acm.hdu.edu.cn/showproblem.php?pid=1010


#include <iostream>#include <cmath>using namespace std;char M[8][8];int dir[4][2] = {{0, -1},{0, 1},{-1, 0},{1, 0}};int di, dj;//终点int n, m, time, wall;bool isfind;void search(int x, int y, int _t){ int i; if (x < 0 || y < 0 || x > n || y > m)  return ; if (x == di && y == dj && _t == time) {  isfind = true;  return ; } if ( (abs(x-di)+abs(y-dj))%2 != (time-_t)%2 ) {   return ; } for (i = 0; i < 4; i++) {  if (M[ x+dir[i][0] ][ y+dir[i][1] ] != 'X') {   M[ x+dir[i][0] ][ y+dir[i][1] ] = 'X';   search(x+dir[i][0], y+dir[i][1], _t+1); //从当前位置继续走下一步   if (isfind) return ;//返回的找到出口时,返回函数   M[ x+dir[i][0] ][ y+dir[i][1] ] = '.';//否则,回朔要恢复之前  } } return ;}int main(){ int i, j; int si, sj; while (scanf("%d %d %d", &n, &m, &time) && (n+m+time)) {  wall = 0;  isfind = false;  getchar();  for (i = 0; i < n; i++) { //初始化迷宫   for (j = 0; j < m; j++) {    scanf("%c",&M[i][j]);    if (M[i][j] == 'S') {si = i; sj = j;}//起点    else if (M[i][j] == 'D') {di = i; dj = j;}    else if (M[i][j] == 'X') {wall ++;}//统计墙的数量   }   getchar();  }  if (n * m - wall <= time) { //在迷宫里用的最大时间没有规定时间多的情况   puts("NO");   continue;  }  M[si][sj] = 'X';  search(si, sj, 0);  if (isfind) {   puts("YES");  }else {   puts("NO");  } } return 0;}