链接:https://www.nowcoder.com/acm/contest/114/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
在平面上有n*n大小的正方形,定义正方形左下角坐标是(1,1),右下角坐标是(n,1)
现在A君在左下角,他的初始方向是向右,他要在正方形内走m步
当A君碰到边界或者已经走过的格子时,他便会逆时针转90°继续走,直到走完m步。
现在给你两个整数n和m,请算出走完m步后A君的坐标。
输入描述:
输入一行两个整数n和m。
输出描述:
输出一行两个数表示A君的坐标。
示例1
备注:
n<=1000,m<n*n
分析:
题意很容易读明白,关键是怎样控制行走的路线,我们可以知道是先从外围的左下角走到右下角,再从右下角走到右上角,再从右上角走到左上角,再从左上角走到左下角,然后再进入第二层这样循环。
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
int q=1,x=1,y=1;///x,y表示当前走到的位置的坐标,q表示的是当前走的是第几圈
while(m>=1)
{
if(y==q)///从左下角走到右下角
{
x++;
m--;
//printf("1:%d %d %d\n",x,y,m);
}
if(x==n&&m>0)///从右下角走到右上角
{
y++;
m--;
//printf("2:%d %d %d\n",x,y,m);
}
if(y==n&&m>0)///从右上角走到左上角
{
x--;
m--;
//printf("3:%d %d %d\n",x,y,m);
}
if(x==q&&y!=q&&m>0)/**从左上角走到左下角,但是y!=q,是因为当我们进入第二层的时候,
再走一步就到(2,2)的位置了,而这时不应该向右走,而不能向下走,这里理解起来注意一下**/
{
y--;
m--;
//printf("4:%d %d %d\n",x,y,m);
}
if(x==q&&y==q+1)///这时候该进入下一层了
{
q++;
n--;
//printf("5:%d %d %d\n",x,y,m);
}
}
printf("%d %d\n",x,y);
return 0;
}