顺时针打印矩阵

This commit is contained in:
nonstriater
2015-12-11 10:43:12 +08:00
parent b4f43c6368
commit 82b73ed9fa
3 changed files with 104 additions and 13 deletions
+8 -8
View File
@@ -94,21 +94,21 @@
###15个经典基础算法
* A*寻路算法: 求解最短路径
* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
* DP (动态规划 dynamic programming)
* Hash
* 快速排序
* 快递选择SELECT
* BFS/DFS (广度/深度优先遍历)
* 红黑树 (一种自平衡的`二叉查找树`)
* KMP 字符串匹配算法
* KMP 字符串匹配算法
* DP (动态规划 dynamic programming)
* A*寻路算法: 求解最短路径
* Dijkstra:最短路径算法 (八卦下:Dijkstra是荷兰的计算机科学家,提出”信号量和PV原语“,"解决哲学家就餐问题",”死锁“也是它提出来的)
* 遗传算法
* 启发式搜索
* 图像特征提取之SIFT算法
* 傅立叶变换
* Hash
* 快速排序
* SPFA(shortest path faster algorithm) 单元最短路径算法
* 快递选择SELECT
## 海量数据处理
@@ -0,0 +1,43 @@
#include "stdio.h"
// a[i*rows+j]
void print_matrix_incircle(int *matrix,int rows,int cols,int start){
int endX = cols-start-1;
int endY = rows-start-1;
//然后依次打印 上,右,下,左
for(int i=start;i<=endX;i++){
printf("%d ",matrix[start*rows+i]);
}
for(int i=start+1;i<=endY;i++){
printf("%d ",matrix[i*rows+endX]);
}
for(int i=endX-1;i>=start;i--){
printf("%d ",matrix[endY*rows+i]);
}
for(int i=endY-1;i>start;i--){
printf("%d ",matrix[i*rows+start]);
}
}
void print_matrix(int *matrix,int rows,int cols){
if(matrix==NULL) return ;
if(rows<=0 || cols<=0) return;
int start = 0;
while(start*2<cols && start*2<rows){
print_matrix_incircle(matrix,rows,cols,start);
start++;
}
}
int main(int argc, char const *argv[])
{
int matrix[] = {1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16};
print_matrix(matrix,4,4);
return 0;
}
+53 -5
View File
@@ -42,9 +42,56 @@
分析:包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题。
一圈一圈打印,第一圈origin是(0,0),第二圈是(1,1)
#### 矩阵式螺旋输出
```
void print_matrix(int **matrix,int rows,int cols);
//或
void print_matrix(int *matrix,int rows,int cols);
```
示例代码:
```
void print_matrix(int *matrix,int rows,int cols){
if(matrix==NULL) return ;
if(rows<=0 || cols<=0) return;
int start = 0;
while(start*2<cols && start*2<rows){
print_matrix_incircle(matrix,rows,cols,start);
start++;
}
}
// a[i*rows+j]
void print_matrix_incircle(int *matrix,int rows,int cols,int start){
int endX = cols-start-1;
int endY = rows-start-1;
//然后依次打印 上,右,下,左
for(int i=start;i<=endX,i++){
printf("\d ",matrix[start*rows+i]);
}
for(int i=start+1;i<=endY,i++){
printf("\d ",matrix[i*rows+endX]);
}
for(int i=endX-1;i>=start;i--){
printf("\d ",matrix[start*rows+i]);
}
for(int i=endY-1;i>start;i--){
printf("\d ",matrix[i*rows+start]);
}
}
```
测试代码见 print_matrix.c
@@ -97,14 +144,15 @@ void printArry(int *a,int rows,int columns)
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,
存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。
#### n支队伍比赛的名次
n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。
所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,
比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......
胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,
下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名
胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5,直至出现第一名
编程实现,给出二维数组w,一维数组order 和 用于输出比赛名次的数组result[n],求出result。