3
这道题是当时我听大一ACMer讲的一道题目,
回来,自己也做了一下,因为听了他们的思路,所以就很快A了,
但是,其中有点小差错啊。
该题目简便的想法就是:(以7为例)
将每一个数字的位置用三个层数来描述,
首先,最直观的就是从上往下数的——第3层,
从左向右数的——第2层 (第一层是 1 3 2 6 5 11 10)
从右向左数的——第2层 (第一层是 1 3 4 8 9 15 16)
我刚开始以为的是将这三个数加起来,算输入的两个数的层差之和。
显然是不对的,
正确的应该是算 两个数 每一个不同方向层差(绝对值)的和。
这次,函数用了引用,不需要设置全局变量了。
#include <iostream> #include <cmath> using namespace std; int jdz(int a) { return a<0?-a:a; } void find_ceng(int x,int &l,int &r,int &s) { double ss; ss=sqrt(double(x)); if(int(ss)!=ss) ss+=1; s=int(ss); // 求出该数所在层,第一个数据和最后一个数据 int start,finish; start=(s-1)*(s-1)+1; finish=s*s; l=(x-start)/2+1; r=(finish-x)/2+1; } int main() { int m,n; // s记录竖直方向,l记录左端开始的层数,r记录右端开始的层数 int m_s,m_l,m_r,n_s,n_l,n_r; while(cin>>m>>n) { find_ceng(m,m_l,m_r,m_s); find_ceng(n,n_l,n_r,n_s); cout<<jdz(m_l-n_l)+jdz(m_r-n_r)+jdz(m_s-n_s)<<endl; } return 0; }