【题解】2014 螺旋矩阵(P2239)
来源:互联网 发布:大逃杀游戏知乎 编辑:程序博客网 时间:2024/05/20 16:42
原题链接
算法分析
初次见到本题,第一个想到的思路肯定是一个一个地推,然后开个二维数组存起来,但是题目末尾的数据范围告诉我们这种方法显然是不现实的。本题解法有很多,但是要学会推导,先来看看
从上述三个矩阵中,不难发现以下规律:
我的方法是一条线一条线地搜,拿变量来存当前的方位和数字,以
每当一条线的行或列与已知点的行或列相同时,就可以通过运算得到已知点的数。行列改变时的运算可以通过
示例代码
#include <bits/stdc++.h>using namespace std;int n, x, y, f1[2] = { -1, 1 }, f2[2] = { 1, -1 };//用x,y表示目标方位,s表示当前数字,f1,f2数组控制方向int main(){ scanf ( "%d %d %d", &n, &x, &y ); if ( x == 1 ){ printf ( "%d\n", y ); return 0; } if ( y == n ){ printf ( "%d\n", n + x - 1 ); return 0; }//上来就先双特判(打表),用上之前推导出的公式 int i = 1, j = n, s = n;//初始化,i和j表示当前方位,s表示当前数字 for ( int k = 1; k < n; k++ ){ for ( int p = 1; p <= 2; p++ ){//因为要加上同一个数2次 s += n - k;//当前数字加上一条线 if ( p == 1 ) i += f1[k % 2] * ( n - k ); //偶数相当于向上i要减去,奇数则反之 else j += f2[k % 2] * ( n - k ); //偶数相当于向右j要加上,奇数则反之 if ( i == x ){//当行相同时,当前数字加上两列之差的绝对值。 printf ( "%d\n", s + abs ( y - j ) ); return 0;//符合条件直接输出结束 } else if ( j == y ){ //当列相同时,当前数字加上两行之差的绝对值。 printf ( "%d\n", s + abs ( x - i ) ); return 0;//同上 } } }}
阅读全文
1 0
- 【题解】2014 螺旋矩阵(P2239)
- 洛谷 P2239 螺旋矩阵
- 洛谷p2239 螺旋矩阵
- 螺旋矩阵 题解
- 螺旋矩阵题解
- 2014NOIP普级组第三题--螺旋矩阵(参考洛谷题解)
- 螺旋方针(螺旋矩阵)
- NOIP 2014 螺旋矩阵
- 螺旋矩阵(java)
- 螺旋矩阵(算法)
- 螺旋矩阵(队列)
- 蛇形矩阵(螺旋矩阵)
- [普及]NOIP 2014 螺旋矩阵
- 打印螺旋矩阵(方阵)
- noip2014 螺旋矩阵 (模拟)
- 逆蛇型矩阵(螺旋魔方矩阵)
- 生成螺旋矩阵(方阵、矩阵)
- [矩阵]螺旋矩阵问题(上)
- JAVA中this详解
- Xamarin.Forms 基础——Application基础
- vue报错 vue Cannot read property ‘ob’ of undefined
- fork与vfork的区别
- ThreadLocal理解
- 【题解】2014 螺旋矩阵(P2239)
- linux如何迁移目录?
- Xamarin.Forms 基础——App Class
- c++导出类的简单实现
- java 图片合成
- springCloud(四)
- 特征选择
- 1037. 在霍格沃茨找零钱(20)
- luogu 3907 :Trie 树板子(dalao勿看,水的辣眼睛)