[bfs] POJ 3009 Curling

#include <stdio.h>  
#include <string.h>  

const int dh[4]={-1, 0, 1, 0};  
const int dw[4]={0, -1, 0, 1};  

char map[24][24];  
int w, h, _x, _y;  
int ans;  

void dfs(int x, int y, int times)  
{  
    if (times >= 10)  
        return;  
    if (times > ans)  
        return;  

    int xt, yt;  

    for (int i = 0; i < 4; i++){  

        xt = x;  
        yt = y;  

        while ( (0<=xt&&xt<h) && (0<=yt&&yt<w) // 向某个方向一直飞啊飞~  
              && (map[xt][yt] == 0 or map[xt][yt] == 2)){//vacant square or start  
            xt += dh[i];  
            yt += dw[i];  
        }  

        if (0<=xt&&xt<h && 0<=yt&&yt<w && map[xt][yt] == 3){ // 飞过(到)目标了           
            if (times+1 < ans){  
                ans = times+1;  
            }  
        }  
        else if (!(xt-dh[i]==x && yt-dw[i]==y) // 必须有空地才能飞啊,待在原地不算啊  
                 && 0<=xt&&xt<h && 0<=yt&&yt<w && map[xt][yt] == 1){ // blocks            
            map[xt][yt] = 0;            
            dfs(xt-dh[i], yt-dw[i], times+1);            
            map[xt][yt] = 1;  
        }  
    }  
}  

int main()  
{  
    while ( 2 == scanf("%d %d", &w, &h) && w && h){  

        for (int i = 0; i < h; i++){  
            for (int j = 0; j < w; j++){  
                scanf("%d", &map[i][j]);                
                if (map[i][j] == 2){  
                    _x = i;  
                    _y = j;  
                }  

            }  
        }  

        ans = 999;  
        dfs(_x, _y, 0);  

        printf("%dn", (ans==999)?(-1):(ans));  

    }  

    return 0;  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值