HDU-1010 Tempter of the Bone(奇偶剪枝)

来源:互联网 发布:淘宝文案格式模板 编辑:程序博客网 时间:2024/06/08 10:28


题意: 有一只可爱的不得了的小狗狗,迷上了一根小骨头,当它叼起了小骨头的时候却发现这是一个陷阱,小骨头就这样背叛了它(咳咳咳),然后它踩着的地面下一秒就会下沉,所以不能在一块地面停留超过一秒钟,倒霉的是,这个迷宫的大门只会在规定的时间内打开不超过1分钟,所以小狗必须在规定时间内到达大门才能逃出迷宫。。。


先是看了一眼数据范围,然后果断深度优先搜索,然后,然后就TLE,然后就眉头一皱发现问题并不简单,原来是缺少了一个必要的技能,那就是奇偶剪枝。。。

先看这样一幅图:

0
1
0
1
01
0
1
0
1
0
1
0101
0101大概不难看出从标0的格子到标0的格子要走偶数步,从标1的格子到标1的格子也要走偶数步,而从标0的格子到标1的格子要走奇数步,所以当给的步数为奇数时,不可能从1位走到另一个1位(或从0到0),设从一个格子A到另一个格子B的最短距离为min,min=abs(x1-x2)+abs(y1-y2); 因为沿途还可能会有障碍,所以A到B的距离dist=min+s; s一定是偶数,所以min和dist同奇偶,所以只要判断给出的限制步数与dist的奇偶性就可以了。。。。真的是一个神奇的大宝贝(?)。。。

代码如下:

//HDU-1010#includeusing namespace std;const int N = 10 + 5;char mat[N][N];bool can;int n,m,k,ex,ey;const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};void DFS(int dx,int dy,int cnt){    if(can) return;    if(dx==ex && dy==ey && cnt==k){ can = true; return; }    int tmp = (k - cnt)-(abs(dx-ex)+abs(dy-ey));    if(tmp < 0 || tmp & 1) return;    for(int d=0;d<4;d++){        int newx = dx + dir[d][0];        int newy = dy + dir[d][1];        if(newx < 0 || newy < 0 || newx >= n || newy >=m || mat[newx][newy]=='X') continue;        mat[newx][newy] = 'X';        DFS(newx,newy,cnt+1);        mat[newx][newy] = '.';    }}int main(){    while(scanf("%d %d %d",&n,&m,&k)==3 && (n||m||k)){        int sx,sy,cnt=0;        for(int i=0;i



原创粉丝点击