【HDU 1010】【搜索】Tempter of the Bone

  其实就是一般的搜索题,问题是剪枝,迷之无限TLE,然后按照别人的写法,发现自己案例都过不去了。按照别人AC的代码一点点改自己可是一直不对。。。最后改了输入输出那边就AC了。可我还是不知道为什么要这样输入数组来找X2。。。


  

#include <iostream>
#include <algorithm>
using namespace std;
int n,m,ex,ey,sx,sy,flag;
char map[15][15];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int t);
int judge(int x,int y);
int main(int argc, char const *argv[])
{
  int t;
 while(cin >> n >> m >> t, n|m|t)
    {
        for(int i = 0; i < n; i++)
        {
            cin >> map[i];
            for(int j = 0; j < m; j++)
            {
                if(map[i][j] == 'S')
                {
                    sx = i;sy = j;
                    map[i][j] = 'X';
                }
                else if(map[i][j] == 'D')
                {
                    ex = i; ey = j;
                }
            }
        }
      flag=0;
      dfs(sx,sy,t);
      flag?printf("YES\n"):printf("NO\n");
  }
  return 0;
}
void dfs(int r, int c, int time)
{
    if(flag)
        return ;
    if((time<abs(r-ex)+abs(c-ey)) || (r+c+ex+ey+time)%2)//减枝
        return ;
    if(time == 0)
    {
        if(r == ex && c == ey)
        {
            flag = 1;
            return;
        }
        else
            return;
    }
    for(int i = 0; i < 4; i++)
    {
        int nr = r + dir[i][0];
        int nc = c + dir[i][1];
        if(nr>=0 && nr<n && nc>=0 && nc<m && map[nr][nc]!='X')
        {
            map[nr][nc] = 'X';
            dfs(nr, nc, time-1);
            map[nr][nc] = '.';
        }
    }
}
int judge(int x,int y)
{
  if(x>0 && y>0 && x<=n && y<=m)
    return 1;
  else
    return 0;
}

你可能感兴趣的:(【HDU 1010】【搜索】Tempter of the Bone)