http://poj.org/problem?id=3009

(1)这是一个用球撞石头的游戏,撞到石头,石碎球停。在规定的10次抛球机会下,若求移动到终点就赢,否则算输了(出界直接算输)。

(2)每一次的深搜都有四个方向,每个方向要一直走,直到出现以下状况为止:

    1)刚要抛球,被墙挡住了(该情况不能抛球);

    2)  出界;

    3)到达终点;

    4) 撞墙。

    其中只有第四种情况需要进行深搜,其他情况均不需要。(虽然这很显然,但是案例

    通不过的基本上就是因为这个,千万小心)。

(3)通过了所有案例,为什么还是WA??小心,注意输入 n,m 顺序问题。题中所给的案例

   恰好与n,m 的顺序无关。。。这是挖好了陷阱等你呢。

(4)稍微注意: if(!n&&!m) break;

总的来说,这是一道不错的dfs入门题。

具体代码:

View Code
#include<stdio.h>
#include<string.h>
#define Inf (1<<28)
int n, m;
int map[25][25];
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int px, py, ans;
int dfs(int x, int y, int depth)
{
    int i, j, k;
    if(depth>10) return 0;
    for(i=0;i<4;i++)
    {
        int tx=x, ty=y, ex, ey;
        int g=0;
        for(j=0;;j=1)
        {
            ex=tx+dir[i][0];
            ey=ty+dir[i][1];
            if(!j&&map[ex][ey]==1) break;   //靠墙,不能投
            if(ex<=0||ex>n||ey<=0|ey>m)  break;  //出界
            if(map[ex][ey]==3)   //终点
            {
                if(ans>depth) ans=depth;
                return 0;
            }
            if(map[ex][ey]==1) {g=1; break;}//撞墙
            tx=ex; ty=ey;//球还在滚动中
        }
        if(g)
        {
            map[ex][ey]=0;
            dfs(tx, ty, depth+1);  //下一步,只有撞墙的才算一步
            map[ex][ey]=1;
        }
    }
    return 0;
}
int main()
{
    int i, j, k;
    while(scanf("%d%d", &m, &n)!=EOF, n||m)  //注意 n, m 的顺序
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            {
                scanf("%d", &map[i][j]);
                if(map[i][j]==2) {px=i;py=j;}
            }
         ans=Inf;
         dfs(px, py, 1);
         if(ans!=Inf) printf("%d\n", ans);
         else printf("-1\n");
    }
    return 0;
}