uva 10161 Ant on a Chessboard(蛇型矩阵)

117 阅读1分钟

题意:

从(1,1)点出发,逆时针,然后顺时针,一直循环绕矩阵,求给出的数字的坐标是多少。

思路:

暴力肯定是不行了,没有那么大的数组,所以只能找规律。注意到偶数行,奇数列的起始都是坐标的平方,这样通过计算与这些特殊点的距离,就可以计算出点的坐标。

#include<iostream>
#include<cmath>
#define eps 1e-6
using namespace std;
int main(){
	 int n, m;
	 while(scanf("%d",&n)&&n){
	 	m=pow(n,0.5)+eps;
	 //	cout<<m<<endl;
		if(m*m==n) {
			if(m%2) printf("%d %d\n",1,m);
			else printf("%d %d\n",m,1);
		}
		else{
			int te=n-m*m;
			if(m%2){
				if(te<=m) printf("%d %d\n",te,m+1);
				else printf("%d %d\n",m+1,(m+1)*(m+1)-n+1);
			}
			else{
				if(te<=m) printf("%d %d\n",m+1,te);
				else printf("%d %d\n",(m+1)*(m+1)-n+1,m+1);
			}
		}
	 }
	 
	return 0;
}

\