hdu1010—我的惯性思维

来源:互联网 发布:深圳华夏职业软件学院 编辑:程序博客网 时间:2024/05/17 05:28

把墙的标记‘X’惯性的写成了‘#’,所以一直调不出来;之后看到是‘X’后,我发现我就是一逗比!

这题剪枝有点多:

一:最少要走的步数>时间;

二:奇偶剪枝——只可能为偶数;

三:步数<时间(走过就会塌掉);

#include<cstdio>#include<cmath>#include<cstring>using namespace std;char map[8][8];int cnt,T,flag,n,m,dx,dy,sx,sy;int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void dfs(int cnt,int x,int y){    if(cnt==T){        if(x==dx&&y==dy)flag=1;        return ;    }    if(flag)return ;    int temp=abs(x-dx)+abs(y-dy)-abs(cnt-T);   //奇偶剪枝;    if(temp>0||temp&1)return ;    for(int i=0;i<4;i++){        int newx=x+dir[i][0];        int newy=y+dir[i][1];        if(newx>=0&&newx<n&&newy>=0&&newy<m&&map[newx][newy]!='X'){            map[newx][newy]='X';            dfs(cnt+1,newx,newy);            map[newx][newy]='.';        }    }}int main(){    //freopen("int.txt","r",stdin);    while(~scanf("%d%d%d",&n,&m,&T)&&(n||m||T)){        int wall=0;        for(int i=0;i<n;i++){            scanf("%s",map[i]);            for(int p=0;p<m;p++){                if(map[i][p]=='S'){sx=i;sy=p;}                else if(map[i][p]=='D'){dx=i;dy=p;}                else if(map[i][p]=='X')wall++;            }        }        if(m*n-wall<=T) {printf("NO\n");continue;}        /*for(int i=0;i<n;i++){            puts(map[i]);        }*/        flag=0;        map[sx][sy]='X';          //不要漏标首元素;        dfs(0,sx,sy);        if(flag)printf("YES\n");        else printf("NO\n");    }}


0 0