现在的位置: 首页 > 综合 > 正文

hdoj 1010 Tempter of the Bone

2019年07月31日 ⁄ 综合 ⁄ 共 993字 ⁄ 字号 评论关闭

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;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.