蛇形矩陣(Snake matrix)是矩陣的一種,常被套用在編程題目與數學數列中,需要提取每條斜線里最小的數字,處理代碼為@echo off&set c=9。
基本介紹
- 中文名:蛇形矩陣
- 提取:每條斜線里最小的數字
- 套用:編程題目與數學數列
- 處理代碼:@echo off&set c=9
算法,生成代碼,
算法
蛇形矩陣的二階等差算法
(以批處理為例):
將整個圖形以對角線斜線分割,只看左半部分。
提取每條斜線里最小的數字,分別是 1 2 4 7 11 16 22 29 35 ... 。這個二階等差數列可以用 (n-1)*n/2+1 計算。批處理即 (a+b-1-1)*(b-1+a)/2+1 。
我們提取每條斜線里最大的數字,分別是 1 3 6 10 15 21 28 36 45 ... 。這個二階等差數列可以用 (n+1)*n/2 計算。批處理即 (a+b-1+1)*(b-1+a)/2 。
通過 e=(%%a+%%b)%%2 確定斜線奇偶性。
通過 (%%a+%%b-1-c)*(%%a+%%b-1-c) 修正右半部分的數值。
使用 !!((%%a+%%b-1)/(c+1)) 定位這些右半部分斜線。
綜合後得到批處理代碼:
@echo off&set c=9
for /l %%a in (1 1 %c%) do (
for /l %%b in (1 1 %c%) do set/a "d=%%a+%%b-1,e=(%%a+%%b)%%2,f=e*((d*d-d)/2+%%a)+!e*((d*d+d)/2-%%a+1)-!!(d/(c+1))*(d-c)*(d-c)"&call set/p=%%f%% <nul
echo;
)
pause
以上算法最大特徵是通過坐標%%a、%%b和階數c直接運算出該點的數值。
生成代碼
PASCAL語言蛇形矩陣生成代碼
Program she; const max=10; var d,i,j,m,N:integer; A:array [1..10,1..10] of integer;
begin write('N=');readln(N); if (N>=1) and (N<=max) then begin i:=1;j:=1;m:=1;d:=1; repeat A[i,j]:=m; {填數}
case d of
1: begin i:=i+1; if j=1 then d:=2 else d:=4; end;
2: begin i:=i-1;j:=j+1;
if j=N then d:=1 else if i=1 then d:=3;end;
3: begin j:=j+1; if i=N then d:=2 else d:=4;end;
4: begin i:=i+1;j:=j-1;
if i=N then d:=3 else if j=1 then d:=1;end;
end;
m:=m+1;
until m>N*N;
writeln('OUTPUT:');
for i:=1 to N do begin for j:=1 to N do write(A[i,j]:4); {輸出填數} writeln;end;
end
else writeln('Input N error!');
end.
C++程式
#include <iostream>
using namespace std;
int main(){
//該程式雖然能通過評測系統的檢測,但時間複雜度為O(n^3),因而有待改進
int N; //矩陣階數
int a[11][11]; //N階矩陣
int count=0; //矩陣元素值,初始為0
cin>>N;
for(int i=1;i<=2*N-1;i++){ //N階方陣有2*N-1條反對角線,依次遍歷之
if(i%2!=0){ //當對角線編號為奇數時,各元素按此對角線上的矩陣各元素下標之和從小到大的順序排列
for(int j=1;j<=N;j++)
for(int k=1;k<=N;k++){
if(j+k==i+1) a[j][k]=++count; //各元素的下標之和==對角線編號+1
}
}
else{ //當對角線編號為偶數時,各元素按此對角線上的矩陣各元素下標之和從大到小的順序排列
for(int j=N;j>=1;j--)
for(int k=N;k>=1;k--){
if(j+k==i+1) a[j][k]=++count; //各元素的下標之和==對角線編號+1
}
}
}
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++){
if(j!=N)
cout<<a[i][j]<<" ";
else
cout<<a[i][j]<<" "<<endl;
}
system("pause");
return 0;
}
C語言蛇形矩陣生成代碼
#include<stdio.h>
void main()
{
int i,j,a[100][100],n,k;
printf("請輸入列數n= ");
scanf("%d",&n);
k=1;
//輸出上三角
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
if(i%2==0) a[i+1-j][j]=k;
else a[j][i+1-j]=k;
k++;
}
//輸出下三角
for(i=n+1;i<2*n;i++)
for(j=1;j<=2*n-i;j++)
{
if(i%2==0) a[n+1-j][i-n+j]=k; //n+1在這裡是定值了
else a[i-n+j][n+1-j]=k;
k++;
}
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}
printf("\n");
}
//上面作者所做的不包含0行和0列因此給出下面版本
#include<stdio.h>
//@Author 面壁者
int main()
{
int i,j,a[100][100],n,k;
printf("請輸入列數n= ");
scanf("%d",&n);
k=1;
//輸出上三角
for(i=0; i<n; i++)
for(j=0; j<=i; j++)
{
if(i%2==0) a[i-j][j]=k;
else a[j][i-j]=k;
k++;
}
//輸出下三角
for(i=n; i<2*n; i++)
for(j=1; j<2*n-i; j++)
{
if(i%2==0) a[n-j][i-n+j]=k; //n+1在這裡是定值了
else a[i-n+j][n-j]=k;
k++;
}
for(i=0; i<n; i++)
{
printf("\n");
for(j=0; j<n; j++)
printf("%4d",a[i][j]);
}
printf("\n");
return 0;
}