螺旋队列问题
来源:互联网 发布:免费数据恢复精灵 编辑:程序博客网 时间:2024/05/22 14:19
问题1:
看清以下数字排列的规律,设1点的坐标是(0,0),x方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),2的坐标为(1,0),3的坐标为(1,1)。编程实现输入任意一点坐标(x,y),输出所对应的数字。
21 22 ...
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
解析:规律能看出来,问题就在于如何利用它。很明显这个队列是按顺时针方向螺旋向外扩展的,我们可以把它看成一层一层往外延伸。第1层规定为中间的那个1,第2层为2到9,第三层为10到25,1、9、25.。。。。不就是平方数么?而且是连续奇数的平方数,那么可以推算第t层之内有(2*t-1)^2个数,给定坐标(x,y),如何知道该点处于第几层?层数t=max(|x|,|y|)。
#include<iostream>#include<cmath>using namespace std;#define MAX(x,y) ((x)>=(y)?(x):(y))int foo(int x,int y){int t=MAX(abs(x),abs(y));int s=(2*t+1)*(2*t+1);int i=t;int j=-t;for(;i>-t;--i)if(i==x&&j==y)return s;else s--;for(;j<t;++j)if(i==x&&j==y)return s;elses--;for(;i<t;++i)if(i==x&&j==y)return s;elses--;for(;j>-t;--j)if(i==x&&j==y)return s;elses--;}int main(){cout<<foo(1,1)<<endl;cout<<foo(-1,-1)<<endl;cout<<foo(1,0)<<endl;return 0;}从所在层的最大的数字开始往回循环,一旦发现移动到给定位置,返回坐标对应的值
打印结果为:
问题2:
打印矩阵:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
这个题目和上题类似,也是上下左右进行移动,只不过,每轮的边界要整体缩减2
#include<iostream>#include<string>#include<vector>using namespace std;#define NUM 5int a[NUM][NUM];void fun(int n){int i,j,s;i=0;j=0;s=1;int p=n;int q=0;int MAX=NUM*NUM;while(s<=MAX){for(;j<p;++j)a[i][j]=s++;j--;i++;for(;i<p;++i)a[i][j]=s++;i--;j--;for(;j>=q;--j)a[i][j]=s++;j++;--i;for(;i>q;--i)a[i][j]=s++;i++;j++;p-=1;q+=1;}}int main(){fun(NUM);for(int i=0;i<NUM;++i){for(int j=0;j<NUM;++j){printf("%d ",a[i][j]);}printf("\n");}return 0;}
0 0
- 螺旋队列问题解法
- 螺旋队列的问题
- 螺旋队列问题
- 螺旋队列问题
- 螺旋队列问题
- 螺旋队列问题2
- 螺旋队列问题
- 螺旋队列问题2
- 螺旋队列问题
- 螺旋队列问题
- 【练习题】螺旋队列问题
- 螺旋队列问题
- 螺旋队列问题
- 螺旋队列问题2
- 螺旋队列问题
- 螺旋队列问题
- 螺旋队列问题
- 很好的讲解螺旋队列问题
- 【安卓笔记】Volley全方位解析,带你从源码的角度彻底理解
- UVALive - 3942 Remember the Word(字典树+dp)
- PHP之同名参数传递方式
- C++ 容器的选用
- 《数据结构学习总结》--表,队列,堆栈
- 螺旋队列问题
- 线段树套treap(ZOJ2112)
- Android Studio终极配置方案
- 情人节送给单身男女的福利
- 日志读写
- 练习--JSP简易网页计数器
- 基于混淆矩阵的评价指标
- (API GUIDE 2)APP FUNDAMENTALS(应用基础)
- 矩阵乘法