您的位置:首页 > 其它

HDU 1728 逃离迷宫

2016-05-03 13:08 423 查看
简单搜索。记录一下到某个点,朝某个方向的最小转弯次数。

#include<iostream>
#include<string>
#include<iomanip>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;

int INF=0x7FFFFFFF;
const int maxn=100+5;
int n,m;
char s[maxn][maxn];
int MIN[5][maxn][maxn];
int X1,X2,Y1,Y2,K;

int dir[4][2]={
{0,1},
{1,0},
{0,-1},
{-1,0}
};
int flag;

bool P(int a,int b)
{
if(a>=0&&a<=n-1)
{
if(b>=0&&b<=m-1)
{
if(s[a][b]!='*')
{
return 1;
}
}
}
return 0;
}

void dfs(int a,int b,int d,int tot)
{
if(tot>K) return;
if(a==X2&&b==Y2)
{
flag=1;
return;
}
for(int i=0;i<4;i++)
{
int x=a+dir[i][0];
int y=b+dir[i][1];

if(P(x,y)==0) continue;

if(i==d)
{
if(tot<MIN[i][x][y])
{
MIN[i][x][y]=tot;
dfs(x,y,i,tot);
}
}

else
{
if(tot+1<MIN[i][x][y])
{
MIN[i][x][y]=tot+1;
dfs(x,y,i,tot+1);
}
}

}

}

int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%s",s[i]);

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
MIN[0][i][j]=INF;
MIN[1][i][j]=INF;
MIN[2][i][j]=INF;
MIN[3][i][j]=INF;
}
scanf("%d%d%d%d%d",&K,&Y1,&X1,&Y2,&X2);
X1--; Y1--; X2--; Y2--;

flag=0;
for(int i=0;i<4;i++)
{
MIN[i][X1][Y1]=0;
dfs(X1,Y1,i,0);
if(flag) break;
}
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: