螺旋矩阵_动态规划解法
2012-04-07 23:26
330 查看
输入n,m,输出一个n行m列的螺旋数组,比如,n=3,m=5时,输出如下:
1 12 11 10 9
2 13 14 15 8
3 4 5 6 7
此题若用动态规划解,代码很短:
也可以用数组解:
不知道有没有更直接的数学解法,直接根据i,j进行变换的~
1 12 11 10 9
2 13 14 15 8
3 4 5 6 7
此题若用动态规划解,代码很短:
#include<stdio.h> #define MAX 20 int fn(int a,int b,int M,int N){/*当边长为M,N时坐标为(a,b)的位置上的数的大小*/ if(b==1||a==N) return a+b-1; if(a==1||b==M) return 2*(M+N)-a-b-1; return fn(a-1,b-1,M-2,N-2)+2*(M+N)-4; } void main({ int n,m,i,j; /*读入数据*/ scanf("%d%d",&n,&m); if(n>MAX||m>MAX) return ; /*求解并输出结果*/ for(i=1;i<=n;i++{ for(j=1;j<=m;j++) printf("%3d ",fn(i,j,m,n)); printf("\n"); } return ; }
也可以用数组解:
#include<stdio.h> #define MAX 20 int map[MAX+2][MAX+2]; void main() { int count,n,m,i,j; /*初始化*/ for(i=0;i<MAX+2;i++) for(j=0;j<MAX+2;j++) map[i][j]=1; /*读入数据*/ scanf("%d%d",&n,&m); if(n>MAX||m>MAX) return ; for(i=1;i<=n;i++) for(j=1;j<=m;j++) map[i][j]=0; /*求解*/ i=1,j=1,count=1; while(count<=n*m) { while(!map[i][j])map[i++][j]=count++; i--;j++; while(!map[i][j])map[i][j++]=count++; j--; i--; while(!map[i][j])map[i--][j]=count++; i++;j--; while(!map[i][j])map[i][j--]=count++; j++;i++; } /*输出结果*/ for(i=1;i<=n;i++) { for(j=1;j<=m;j++) printf("%3d ",map[i][j]); printf("\n"); } return ; }
不知道有没有更直接的数学解法,直接根据i,j进行变换的~
相关文章推荐
- 螺旋矩阵 解法
- 我的螺旋矩阵解法!
- 由外向内的螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 判断可能出栈顺序--动态规划解法
- [动态规划]矩阵连乘
- Codeforces 506E Mr. Kitayuta's Gift (矩阵乘法,动态规划)
- 螺旋矩阵 II
- 打印螺旋矩阵
- 动态规划(dynamic programming)及示例(矩阵连乘、最长公共子序列、三角剖分)
- BZOJ 1875 [SDOI2009]HH去散步 ——动态规划 矩阵乘法
- 【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
- Java编程实现打印螺旋矩阵实例代码
- 螺旋矩阵
- 约瑟夫问题(动态规划解法)
- HRBUST 1564 螺旋矩阵 DFS
- 脑洞脑洞 螺旋矩阵
- 1050. 螺旋矩阵
- 51nod-矩阵取数问题-【动态规划】