DFS+剪枝

题目: hdu 1010;

预:

char map[10][10];
int flag,Xnum,Sx,Sy,Dx,Dy;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

DFS(int x,int y,int time):

if(x<=0||x>n||y<=0||y>m) return;
if(flag==1) return;
if(x==Dx&&y==Dy&&time==t)
{
    flag=1;
    return;
}
//奇偶性剪枝:不管怎么绕,最短距离+偶数,来源:百科
int temp=(t-time)-abs(x-Dx)-abs(y-Dy);
if(temp<0||temp&1) return;

for(int i=0;i<4;i++)
{
    int x1=x+dir[i][0];
    int y1=y+dir[i][1];
    if(map[x1][y1]!='X')
    {
        map[x1][y1]='X';
        DFS(x1,y1,time+1);
        map[x1][y1]='.';
    }
}
return;

main:

Xnum=0;
for(int i=1;i<=n;i++)
{
    for(int j=1;j<=m;j++)
    {
        cin>>map[i][j];
        if(map[i][j]=='S')
        {
            Sx=i;
            Sy=j;
        }
        if(map[i][j]=='D')
        {
            Dx=i;
            Dy=j;
        }
        if(map[i][j]=='X')
        {
            ++Xnum;
        }
    }
    flag=0;
    map[Sx][Sy]='X';
    if(n*m-Xnum<=t)
    {
        cout<<"NO"<continue;
    }
    DFS(Sx,Sy,0);
    if(flag)
        cout<<"YES"<else
        cout<<"NO"<

你可能感兴趣的:(算法)