洛谷P2239 螺旋矩阵 题解
Summary
洛谷 P2239 螺旋矩阵 的题解,
算法为 模拟 .
Link
Text
蒟蒻没有化简各位 dalao 凑合着用用. 一开始就想到模拟, 但是肯定超时, 后来加了判断, 如果不在那一行 / 那一列就跳过.
洛谷神机 0ms...
因为是要求那个数字的值, 相当于求从出发到那里走了多少步, 所以用一个变量来存, 而不用开数组 (数组太大)
1 2 3 4 <- 从行首到行末走了四步
2 1 2 1
1 1 1 2
3 2 1 3 <- 从列首到列尾走了三步
(搬运至新博客时注: 当时还不会用表格, 现在嘛... 咕咕咕)
(再次搬运至新博客时注: 当年都是刷的什么水题都敢发题解...)
可见走的步数是有规律的,4>3>3>2>2>1>1 第一次是 n, 第二次是 n -1, 然后每两次 -1...
然后模拟就可以了.
Code
#include <stdio.h>
int main()
{
int a=0,b=1,n,i,j;
long long c=0;
scanf ("%d%d%d",&n,&j,&i);//读入
if (b!=j)
{
a+=n;
c+=n;
}
else//第一行特判
{
for (int x=0;x<n;x++)
{
a++;
c++;
if (a==i) break;
}
}
n--;//减少移动长度
while ((a!=i)||(b!=j))//循环判断
{
if (a!=i)//如果不在这一列就直接跳过
{
b+=n;
c+=n;//累加步数
}
else//如果在就一个一个走过去
{
for (int x=0;x<n;x++)
{
if (b==j) break;
b++;
c++;//累加步数
}
}
if (b!=j)//如果不在这一行就直接跳过
{
a-=n;
c+=n;//累加步数
}
else//如果在就一个一个走过去
{
for (int x=0;x<n;x++)
{
if (a==i) break;
a--;
c++;//累加步数
}
}
n--;//减少移动长度
if (a!=i)//同上[其实是因为懒
{
b-=n;
c+=n;
}
else
{
for (int x=0;x<n;x++)
{
if (b==j) break;
b--;
c++;
}
}
if (b!=j)
{
a+=n;
c+=n;
}
else
{
for (int x=0;x<n;x++)
{
if (a==i) break;
a++;
c++;
}
}
n--;
}
printf ("%lld",c);//输出
return 0;
}