2016年10月9日 星期日

C語言 螺旋矩陣 功課 struct

剛好資料結構出的功課又來寫了一次
struct裡面宣告方法真是機掰,有夠麻煩我還到藍色小舖發問
http://www.blueshop.com.tw/board/FUM20050124191259IGD/BRD20161006215125N33.html

這題是螺旋矩陣
原本以前寫過一次之後再寫,可是覺得寫得太醜了
所以參考一下別人的https://tw.answers.yahoo.com/question/index?qid=20120508000016KK09872
可是中間個那個ax,ay轉換實在是有點亂,所以改了一個易懂的用r[4][2]
以順時針的來就是先走J再走I然後走-J最後走-I
-I走完還要用下一個陣列是否為0來判斷,是否該轉向

#include <stdio.h>
#include <stdlib.h>
#define N 10

struct SpiralMaxtrix
{
int n;
int maxtrix[N][N];
void (*ShowMatrix)(struct SpiralMaxtrix A); /*ShowMatrix是函式指標*/
void (*ShowMatrixR)(struct SpiralMaxtrix A); /*ShowMatrixR是函式指標*/
}A;

void func_ShowMatrix(struct SpiralMaxtrix A)
{
int i=0,j=0,num=1,temp;
int iy=0,jx=0,a=0;
int r[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
while(num<=A.n*A.n){
A.maxtrix[i][j]=num;
iy=i+r[a%4][0];
jx=j+r[a%4][1];
if(iy<0||iy>=A.n||jx<0||jx>=A.n||A.maxtrix[iy][jx]!=0){
a++;
}
i+=r[a%4][0];
j+=r[a%4][1];
num++;
}
for(i=0;i<A.n;i++){
for(j=0;j<A.n;j++){
printf("%-3d",A.maxtrix[i][j]);
}
printf("\n");
}
}

void func_ShowMatrixR(struct SpiralMaxtrix A)
{
int i=0,j=0,num=1,temp;
int iy=0,jx=0,a=0;
int r[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
while(num<=A.n*A.n){
A.maxtrix[i][j]=num;
iy=i+r[a%4][0];
jx=j+r[a%4][1];
if(iy<0||iy>=A.n||jx<0||jx>=A.n||A.maxtrix[iy][jx]!=0){
a++;
}
i+=r[a%4][0];
j+=r[a%4][1];
num++;
}
for(i=0;i<A.n;i++){
for(j=0;j<A.n;j++){
printf("%-3d",A.maxtrix[i][j]);
}
printf("\n");
}
}

int main(int argc, char *argv[])
{
A.ShowMatrix=func_ShowMatrix; /*使用前要先把指標指向真實的函數*/
A.ShowMatrixR=func_ShowMatrixR;
printf("請輸入n:");
scanf("%d",&A.n);
printf("順時針印出:\n");
A.ShowMatrix(A);
printf("逆時針印出:\n");
A.ShowMatrixR(A);
return 0;
}