poj 3009 - Curling 2.0


点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <cstring>

  4. using namespace std;

  5. int p,q;
  6. int si,sj;
  7. #define MAX_V (20+1)
  8. #define MAX_L (10)
  9. int T[MAX_V][MAX_V];
  10. #define inf (2000000000)

  11. struct move{
  12.     int i;
  13.     int j;
  14. }MOVE[4]={{0,1},{1,0},{0,-1},{-1,0}};

  15. int isValid(int i,int j)
  16. {
  17.     if(i < 1 || i> q)
  18.         return 0;
  19.     if(j < 1 || j> p)
  20.         return 0;

  21.     return 1;
  22. }

  23. #define printf //
  24. int dfs(int i,int j,int t[][MAX_V],int l) //l表示当前步数
  25. {

  26.     if(l > MAX_L)
  27.         return -1;

  28.     int mi,mj,lmi,lmj;
  29.     int minp=inf;

  30.     printf("\n%d-------------------------------------------\n",l);
  31.     printf("\nfrom (%d,%d)=%d\n\n",i,j,t[i][j]);

  32.     for(int m=0;m<4;m++)
  33.     {
  34.         mi=i;
  35.         mj=j;
  36.         bool bFirstAdj=true;

  37.         printf("\n m=%d\n\n",m);
  38.         while(true)
  39.         {
  40.             lmi=mi;
  41.             lmj=mj;
  42.             mi += MOVE[m].i;
  43.             mj += MOVE[m].j;

  44.             //printf("try (%d,%d)\n",mi,mj);
  45.             if(!isValid(mi,mj))
  46.                 break;

  47.             printf("t[%d][%d]=%d\n",mi,mj,t[mi][mj]);
  48.             if(t[mi][mj] == 1)
  49.             {
  50.                 if(bFirstAdj)
  51.                 {
  52.                     printf("first block break....\n");
  53.                     break;
  54.                 }

  55.                 int tmp[MAX_V][MAX_V];
  56.                 memcpy(tmp,t,sizeof(tmp));
  57.                 tmp[mi][mj]=0;

  58.                 printf("set (%d,%d)=%d\n",mi,mj,tmp[mi][mj]);

  59.                 int ret = dfs(lmi,lmj,tmp,l+1);

  60.                 if(ret != -1)
  61.                 {
  62.                     if(ret < minp)
  63.                     {
  64.                         minp = ret;
  65.                         printf("(%d,%d) ret =%d < minp=%d",mi,mj,ret,minp);
  66.                     }
  67.                 }

  68.                 break;
  69.             }
  70.             else if(t[mi][mj] == 3)
  71.             {
  72.                 return l;
  73.             }

  74.             bFirstAdj=false;
  75.         }
  76.         
  77.     }    

  78.     if(minp == inf)
  79.         return -1;
  80.     return minp;
  81. }

  82. int main()
  83. {
  84.     while(cin>>p>>q)
  85.     {
  86.         if( p == 0 )
  87.             break;

  88.         for(int i=1;i<=q;i++)
  89.         {
  90.             for(int j=1;j<=p;j++)
  91.             {
  92.                 cin >>T[i][j];
  93.                 if(T[i][j] == 2)
  94.                 {
  95.                     si=i;
  96.                     sj=j;
  97.                     //printf("si=%d,sj=%d\n",si,sj);
  98.                 }
  99.             }
  100.         }

  101.         printf("---------------------------------------\n");
  102.         cout<<dfs(si,sj,T,1)<<endl;
  103.         printf("---------------------------------------\n");
  104.     }
  105. }

<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(17) | 评论(0) | 转发(0) |
0

上一篇:poj 1321

下一篇:poj 3083

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值