POJ-3009-Curling 2.0- DFS

8 篇文章 0 订阅
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int n, m, step;
int qx, qy, zx, zy;
int mp[27][27];
int mans=9999999;
void dfs(int x, int y)
{
    int i,xx,yy;
    if(step >= 10 || step >= mans)
      return ;
    for(i = 0; i < 4; i++)
    {
        xx = x;
        yy = y;
        while(1)
        {
            xx = xx+dx[i];
            yy = yy+dy[i];
            if(xx < 0 || yy < 0 || xx>=n||yy >= m)
                break;
            if(xx == zx && yy == zy)
            {
                step++;
                if(step < mans)
                    mans = step;
                step--;
                return;
            }
            else if(mp[xx][yy]==1)
            {
                if(xx-dx[i]!=x||yy-dy[i]!=y)
                {
                    step++;
                    mp[xx][yy] = 0;
                    dfs(xx-dx[i],yy-dy[i]);
                    step--;
                    mp[xx][yy] = 1;
                }
                break;
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d",&m,&n)&&(n+m))
    {
       int i, j;
       step = 0;
       mans = 999999;
       for(i = 0; i < n; i++)
       {
           for(j = 0; j < m; j++)
           {
              scanf("%d",&mp[i][j]);
              if(mp[i][j] == 2)
              {
                  qx = i;
                  qy = j;
              }
              if(mp[i][j]==3)
              {
                  zx = i;
                  zy = j;
              }
           }
       }
       mp[qx][qy]=0;
       dfs(qx,qy);
       if(mans == 999999)
         printf("-1\n");
       else
         printf("%d\n",mans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值