如圖,生成如此旋轉的矩陣 輸入行N,列M,求上述矩陣 假定 縱向為x軸,橫向為y軸,從1開始 層數 k=min(i,j,N+1-i,M+1-j) k層矩陣的長 l=N-(k-1)*2 寬 w=M-(k-1)*2 矩陣左上角的坐標值為(k,k),根據外層矩陣的長寬可以算出數值,進而確定當前矩陣(i,j ...
如圖,生成如此旋轉的矩陣 輸入行N,列M,求上述矩陣
假定 縱向為x軸,橫向為y軸,從1開始
層數 k=min(i,j,N+1-i,M+1-j)
k層矩陣的長 l=N-(k-1)*2 寬 w=M-(k-1)*2
矩陣左上角的坐標值為(k,k),根據外層矩陣的長寬可以算出數值,進而確定當前矩陣(i,j)的值
缺點 :代碼中有很多重覆計算,可以通過記錄一些值來減少計算次數
#include<stdio.h> #define min(x,y) (x)>(y)?(y):(x) int N,M; int foo(int,int); int main() { while(scanf("%d %d",&N,&M)==2) for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { printf("%3d ",foo(i,j)); } printf("\n"); } } int foo(int i,int j) { int k=min( min(i,j) , min(N+1-i,M+1-j) ); int l=N-(k-1)*2, w=M-(k-1)*2; int s=0; for( int t=1;t<k;t++ ) { int l=N-(t-1)*2, w=M-(t-1)*2; s+=(l-1)*2+(w-1)*2; } s++; if(l==1) s+=j-k; else if(w==1) s+=i-k; else { if(i==k) s+=j-k; else if(j==k+w-1) s+=w-1+i-k; else if(i==k+l-1) s+=w-1+l-1+k+w-1-j; else s+=w-1+l-1+w-1+k+l-1-i; } return s; }