poj2488坑爹的大水题

 这是一道很多恶心细节的题目。在做完了这道题后给了我很多反思。为什么我的DFS总是不能一次的A过。。。现在发现代码的规范化是很有必要的。今天要学会规范自己的代码。。。这道题先不说它的其他的常规的坑,那些在DISCUSS里面就可以找到。对于我来说,这题之所以调了这么久还在于回溯本身的理解。只是在递归的时候始终想通过人为的设置条件让其递归返回。其实搜索都是有界的。。。尴尬。这个简单的事实被我忽略了很多次。但是好歹它是被我调出来了。。。真是囧啊~~~~明天的排位赛,照这样的态势,可能会死得很是难看的啊~~~~~

         附上代码:

#include<stdio.h>
#include<string.h>
int dx[8]={-1,1,-2,2,-2,2,-1,1};
int dy[8]={-2,-2,-1,-1,1,1,2,2};
int a[70][70],fx[70][70],fy[70][70];
int p,q,ans=1,impossible=0,count,k=1;
void pr(int i,int j){
    if(fx[i][j]==-1 && fy[i][j]==-1){
    printf("Scenario #%d:\nA1",k++);
    }
    else{
    pr(fx[i][j],fy[i][j]);
    printf("%c%d",j+'A',i+1);
    }
}
void find(int x,int y){
   int i,j,xn,yn,flag=0;
   if(count==p*q){
       pr(x,y);
      ans=0;
   }
   else{
       if(ans==0){
       return;}
       else{
        for(i=0;i<=7;i++){
      xn=dx[i]+x;
      yn=dy[i]+y;
      if(xn>=0 && xn<=p-1 && yn>=0 && yn<=q-1){
          if(a[xn][yn]==0){
              count++;
              flag=1;
              a[xn][yn]=1;
              fx[xn][yn]=x;
              fy[xn][yn]=y;
              find(xn,yn);
              a[xn][yn]=0;
              count--;
              
          }
      }
   }
   }
   
       }
}
main(){
int t;
   scanf("%d",&t);
   while(t--){
       memset(a,0,sizeof(a));
       count=1;
       ans=1;
       impossible=0;
      scanf("%d%d",&p,&q);
      a[0][0]=1;
      fx[0][0]=-1;
      fy[0][0]=-1;
      find(0,0);
      if(ans)
      printf("Scenario #%d:\nimpossible",k++);
      printf("\n\n");
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值