HDU 1010 搜索 奇偶剪枝
Posted znk97
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1010 搜索 奇偶剪枝相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char map[8][8];
int n, m, t;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool visit[8][8];
int xx, yy;
bool ans = false;
void dfs(int x, int y, int cnt) //位置 时间
{
visit[x][y] = true;
if(map[x][y] == ‘D‘ && cnt == t)
{
ans = true;
return;
}
if(cnt>=t) return;
for(int i = 0; i < 4; i++)
{
int xt = x+dir[i][0];
int yt = y+dir[i][1];
if(xt >= 1 && xt <= n && yt >= 1 && yt <= m && map[xt][yt] != ‘X‘ && !visit[xt][yt])
{
dfs(xt, yt, cnt+1);
visit[xt][yt] = false;
if(ans) return;
}
}
}
int main()
{
int x, y;
while(cin >> n >> m >> t && n+m+t)
{
ans = false;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> map[i][j];
if(map[i][j] == ‘S‘) x = i, y = j;
if(map[i][j] == ‘D‘) xx = i, yy = j;
}
}
//剪枝
int tmp = t-abs(xx-x)-abs(yy-y);
if(abs(x-xx)+abs(y-yy) > t || tmp&1) //距离过大 和 奇偶剪枝
{
cout << "NO" << endl;
continue;
}
memset(visit, false, sizeof visit);
dfs(x, y, 0);
if(ans) cout << "YES" << endl;
else cout << "NO" << endl;
}
system("pause");
return 0;
}
以上是关于HDU 1010 搜索 奇偶剪枝的主要内容,如果未能解决你的问题,请参考以下文章
hdu1010Tempter of the Bone(dfs+奇偶剪枝)