螺旋队列和hiho1525逃离迷宫3

我是真调不出错误了!

hiho1525逃离迷宫3

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//中间变量为长整形,so x,y变量一定要设置为长整型
long long cal(long long x,long long y)
{
    if (x<=y && y<=-x && x<=0)
        return (4*x*x-3*x+y)%26;
    else if (-y+1<=x && x<=y-1 && y>0)
        return (4*y*y-3*y+x)%26;
    else if (-x+1<=y && y<=x && x>0)
        return (4*x*x-x-y)%26;
    else if (y+1<=x && x<=-y && y<0)
        return (4*y*y-y-x)%26;
}

int main()
{
    long n,i,k;
    long long dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
    long long x,y,e,s[4];
    scanf("%ld",&n);
    for (k=1;k<=n;k++)
    {
        scanf("%lld%lld",&x,&y);
        //任意两个字母必存在相邻的两个位置
        //(0,0)[a]->( , )[a]->( , )[b]->(x,y)[b],三步必能实现
        //所以寻找一步、两步(小于三步)的操作

        //a=b:一步
        //a<>b:大于一步
        //(0,0)[a]->( , )[a]->(x,y)[b] 相邻
        //(0,0)[a]->( , )[b]->(x,y)[b] 相邻
        //寻找一步上下左右操作,(0,0)能否到达字母为b的格
        //寻找一步上下左右操作,(x,y)能否到达字母为a的格

        if (x==0 && y==0)
        {
            printf("0
");
            continue;
        }
        e=cal(x,y);
        for (i=0;i<3;i++)
            s[i]=cal(x+dx[i],y+dy[i]);

        if ((x==0 && y==1) || (x==0 && y==-1) || (x==1 && y==0) || (x==-1 && y==0))
            printf("1
");
        else if (e==0)
            printf("1
");
        else if ((x==0 && y==2) || (x==0 && y==-2) || (x==-2 && y==0) || (x==2 && y==0))
            printf("2
");
        else if ((x==1 && y==1) || (x==1 && y==-1) || (x==-1 && y==1) || (x==-1 && y==-1))
            printf("2
");
        //(0,0)->相邻[B D F H]->(x,y)
        else if (e==1 || e==3 || e==5 || e==7)
            printf("2
");
        //(x,y)->相邻[0]->(0,0)
        else if (s[0]==0 || s[1]==0 || s[2]==0 || s[3]==0)
            printf("2
");
        else
            printf("3
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/cmyg/p/7239047.html