10161 - Ant on a Chessboard

本文介绍了一个寻找特定数字在无限螺旋矩阵中的位置的算法。通过分析数字分布规律,利用数学方法确定坐标,适用于解决大规模数据查询问题。

 由于本人是新手,所以刚看这道题,就想着用数组存数据,然后再根据输入的n找到n的位置,直到写的时候才发现n有大小限制,那么我用数组写的想法就不能用了了抓狂抓狂,由于太垃圾实在想不出其他的办法就只能看大佬的题解了,看完之后慢慢想想,终于看出了一点门道,你看图中左下角到右下角的数字正好是一个等差数列,知道就也好办了大笑大笑,根据这些判断上下左右的数字与这些数字的关系,大于的分成一类,小于的分成一类,然后再判断输出就行;

本人的语言叙述实在有限,话不多说,上代码(代码写的也不好委屈委屈):

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
void where(int n)
{
    int m=sqrt(n);
    if(m*m==n){ //判断 n 是否是 m 平方数;
        if(m%2==0) //判断 n 在第一行还是在第一列;
            cout<<m<<" "<<1<<endl;
        else
            cout<<1<<" "<<m<<endl;
    }
    else{
        if(n==m+m*m+1) //判断 n 是否为左下角到右下角上的数字;
            cout<<m+1<<" "<<m+1<<endl;
        else if(n>m+m*m+1){ //判断 n 是否大于该行或该列对角线上的数字;
            int p=n-m*m-m-1; //找出 n 与对角线上数字的位置差;
            if(((m+1)*(m+1)-m-m*m-1)%2==0)//判断 n 是否在对角线数字的左面;
                cout<<m+1-p<<" "<<m+1<<endl;
            else                          //判断 n 是否在对角线数字的下面;
                cout<<m+1<<" "<<m+1-p<<endl;
        }
        else if(n<m+m*m+1){ //判断 n 是否小于该行或该列对角线上的数字;
            int p=m+m*m+1-n; //找出 n 与对角线上数字的位置差;
            if((m+m*m+1-(m-1)*(m-1))%2==0) //判断 n 是否在对角线数字的下面;
                cout<<m+1<<" "<<m+1-p<<endl;
            else                           //判断 n 是否在对角线数字的左面;
                cout<<m+1-p<<" "<<m+1<<endl;

        }
    }
}

int main()
{
    int n;
    while(cin>>n && n!=0){
        where(n);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值