1.蛇形矩陣更新。2015-1-12
#include<stdio.h>
#define N 10
void snake(bool fromout)
{
int a[N][N];
int start=(fromout?0:-N*N-1);
for(int k=0;k<N/2;k++)
{
int i=k,j=k;
for(j=k;j<N-k-1;j++)
a[i][j]=++start;
for(i=k;i<N-k-1;i++)
a[i][j]=++start;
for(j;j>k;j--)
a[i][j]=++start;
for(i;i>k;i--)
a[i][j]=++start;
}
//print
for(int i=N-1;i>=0;i--)
{
for(int j=0;j<N;j++)
printf("%4d",(fromout?1:-1)*a[j][i]);
printf("\n");
}
}
int main()
{
snake(0);
printf("\n\n");
snake(1);
return 0;
}
[舊版]1.輸出蛇形矩陣,由外層向內層和由外層向內層。
下面貼上由外層向內層的代碼:
#include<stdio.h>
#define N 10
int a[N][N]={0};
int count;
void fill_value_around(int line,int column)
{
if(line>column)
return;
else if(line==column)
a[line][column]=++count;
int narrow=line;
int line_record=line,column_record=column;
for(;line<N-1-narrow;line++)
a[line][column]=++count;
for(;column>narrow;column--)
a[line][column]=++count;
for(;line>narrow;line--)
a[line][column]=++count;
for(;column<N-1-narrow;column++)
a[line][column]=++count;
fill_value_around(line+1,column-1);
}
int main()
{
count=0;
fill_value_around(0,N-1);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%4d ",a[i][j]);
printf("\n");
}
getchar();
}
如果希望由外向內,只需修改main函數中代碼如下(只要修改count=-N*N-1和printf中加負號)
int main()
{
count=-N*N-1;//修改1
fill_value_around(0,N-1);
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%4d ",-a[i][j]);//修改2
printf("\n");
}
getchar();
}
簡單說一下思路,寫一個函數,目的是填寫外圈的一層,然後到達下一層的入口。然後遞歸即可。2.Z字形填數。
1 2 6
3 5 7
4 8 9
思路:lean_fill函數,toward用來記錄方向,區分是向左下還是右上填寫。、
在函數內部執行循環直至到達邊界。
有一個地方,填完最長的對角線後,我選擇了從右下角再開始反着填寫。不過後來想起來,每條線上的數字角標是有規律的,其角標和逐次+1。
不過這麼寫有更好的適應性,只需要修改邊界和填寫方向即可實現不同方向的Z字填數。
#include<stdio.h>
#include<windows.h>
#define N 5
int a[N][N]={0};
int count;
void lean_fill(int toward,int line,int column)
{
while(line<N&&column<N&&line>=0&&column>=0)
{
a[line][column]=++count;
line=line+toward;
column=column-toward;
}
}
int main()
{
count=0;
int line=0,column=0;
int flag=1;
for(int i=0;i<N;)
{
flag=-flag;
lean_fill(flag,i++,0);
flag=-flag;
lean_fill(flag,0,i++);
}
count=-N*N-1;
flag=-1;
for(int i=N-1;i>0;)
{
flag=-flag;
lean_fill(flag,i--,N-1);
flag=-flag;
lean_fill(flag,N-1,i--);
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(a[i][j]<0)
a[i][j]*=-1;
Sleep(100);
printf("%4d ",a[i][j]);
}
printf("\n");
}
getchar();
}
以上兩題難度不大,主要還是學到了用windows.h延時輸出纔想着把它們貼上來以做記錄。