顺时针打印矩阵
This commit is contained in:
@@ -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
@@ -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。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user