hdu 4740

肯定是贵州老乡出的题,很简单的一个模拟题,稍微坑点的地方在如果开始两个出发点就相同的话,那么就直接输出,好了前几天网络赛就做这两题,不过一个人做还是有进步了,继续加油。

#include<cstdio>
#include<cstring>

int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int vis1[1005][1005];
int vis2[1005][1005];
int r1,c1,d1,r2,c2,d2,n;

void dfs(){
     int flag1=1, flag2=1;
     while(1){
          if(flag1){
              int x,y;
              x=r1+dir[d1][0]; y=c1+dir[d1][1];
              if(x>=0&&x<n&&y>=0&&y<n&&!vis1[x][y]){
                  r1=x; c1=y;
                  vis1[r1][c1]=1;
              }
              else{
                  d1=(d1+1)%4;
                  x=r1+dir[d1][0]; y=c1+dir[d1][1];
                  if(x>=0&&x<n&&y>=0&&y<n&&!vis1[x][y]){
                      r1=x; c1=y;
                      vis1[r1][c1]=1;
                  }
                  else  {  flag1=0;  }
              }
          }
          
          if(flag2){
              int x,y;
              x=r2+dir[d2][0]; y=c2+dir[d2][1];
              if(x>=0&&x<n&&y>=0&&y<n&&!vis2[x][y]){
                  r2=x; c2=y;
                  vis2[r2][c2]=1;
              }
              else{
                  d2=(d2+3)%4;
                  x=r2+dir[d2][0]; y=c2+dir[d2][1];
                  if(x>=0&&x<n&&y>=0&&y<n&&!vis2[x][y]){
                      r2=x; c2=y;
                      vis2[r2][c2]=1;
                  }
                  else  {  flag2=0;  }
              }
          }
          if(!flag1&&!flag2)break;
          if(r1==r2&&c1==c2)break;
     }
}

int main(){
     while(scanf("%d",&n)&&n){
          scanf("%d %d %d",&r1,&c1,&d1);
          scanf("%d %d %d",&r2,&c2,&d2);
          if(r1==r2&&c1==c2)
          {  printf("%d %d\n",r1,c1);  continue; }
          memset(vis1,0,sizeof(vis1));
          memset(vis2,0,sizeof(vis2));
          vis1[r1][c1]=1;
          vis2[r2][c2]=1;
          dfs();
          if(r1==r2&&c1==c2)printf("%d %d\n",r1,c1);
          else printf("-1\n");
   
     }
     return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值