DFS+剪枝

来源:互联网 发布:iface702考勤软件 编辑:程序博客网 时间:2024/05/21 13:59

题目: 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"<<endl;        continue;    }    DFS(Sx,Sy,0);    if(flag)        cout<<"YES"<<endl;    else        cout<<"NO"<<endl;}
0 0