传送门UVa 10161 - Ant on a Chessboard
一样, 看了二十来分钟没有思路.
刚看解题报告的时候还看不懂, 看了好久, 又观察了一下那个矩阵, 终于摸索出了门道来.
这题的要点在于要发现那条 "副对角线" 的值和输入的关系. 副对角线的值等于 n(n - 1) + 1, 然后把输入开根号就可以得到行或者列 (这里我想了很久还是想不懂原理...) , 接着根据他们的关系得出结果.看完解题报告我只想说三个字:
这TM谁想得出来啊!!!"
具体请看代码 I
PS: 我觉得我要在数学专题上往死里跪了. 我已经做好做一题看一次解题报告的准备了
----------------------------------------我是华丽的分割线-----------------------------------------
4.15日补充
今天上英语课又把这个题拿出来想, 终于让我找出了一些规律, 虽然没有方便多少, 但是对我来说是好理解多了, 至少不用去看那条"副对角线"的值(ˉ▽ ̄~)
观察一下那个矩阵, 就像圆一样,
n的平方要么在y轴上, 要么在x轴上 (请原谅我简陋地拿坐标轴过来说), 而且根据n的奇偶, 只是递增的方向不一样, 并且n的平方最大.
哎...我又描述不出来了...大家意会一下吧.. 就是可以拿n平方和step的差来算.详情见代码 II
PS:想这道题的时候老师正好在提问听力, 然后我竟然被叫起来了.然后......TAT
/************************************代码 I***************************************/
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
//freopen("input.txt", "r", stdin);
int colomn;
int step;
int row;
int value;
while (scanf("%d", &step) == 1 && step)
{
int c = (int)ceil(sqrt(step));
//c可能是行或者列.要和那条"对角线"上的值对比才能得出.
value = c * (c - 1) + 1;
if (c & 1) //如果c是奇数.
{
if (step >= value) //如果step大于那个值, 则c就是行.
{
row = c;
colomn = c - (step - value);
}
else //c是列.
{
colomn = c;
row = c - (value - step);
}
}
else //和上面相反
{
if (step >= value) //此时c是列.
{
colomn = c;
row = c - (step - value);
}
else //c是行
{
row = c;
colomn = c - (value - step);
}
}
printf("%d %d\n", colomn, row);
}
return 0;
}
/***************************************代码 II****************************************/
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int step;
int n, value;
int colomn, row;
int differ;
while (scanf("%d", &step) == 1 && step)
{
n = (int)ceil(sqrt(step));
value = n * n;
differ = value - step; //计算出step和value的差.
if (n & 1) //如果n是奇数, 观察得, 从右往左数
{
if (differ > n - 1) //说明需要"拐弯", 即行数有变化, 此时列数和n相等.
{
colomn = n;
row = n - (differ - (n - 1)); //这个观察一下也很容易得出来.
}
else //此时不需要"拐弯"
{
row = n;
colomn = 1 + differ; //观察一下...
}
}
else
{
if (differ > n - 1)
{
colomn = 2 * n - differ - 1; //就把上面那个式子化简了一下.
row = n;
}
else
{
colomn = n;
row = 1 + differ;
}
}
printf("%d %d\n", colomn, row);
}
return 0;
}