文章目錄
蛇形填數
Description
在n*n方陣裏填入1,2,…,n*n,要求填成蛇形。例如n=4時方陣爲:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
Input
直接輸入方陣的維數,即n的值。(n<=100)
Output
輸出結果是蛇形方陣。
Sample Input
3
Sample Output
7 8 1
6 9 2
5 4 3
這道題比較簡單,是從右上角開始順時針地從外往內填數。
從右上角開始移動,直到碰到邊界或者碰到非0的元素,就改變方向。
#include <stdio.h>
#include <string.h>
using namespace std;
int main(void)
{
int n,sum=0;
int arr[105][105];
scanf("%d",&n);
int x=0,y=n-1;//行列
memset(arr,0,sizeof(arr));
arr[x][y]=++sum;//填入1
while(sum<n*n)
{
//沒有超出矩陣的範圍,且元素爲0時
while(x+1<n&&!arr[x+1][y])//向下移動
arr[++x][y]=++sum;
while(y-1>=0&&!arr[x][y-1])//向左移動
arr[x][--y]=++sum;
while(x-1>=0&&!arr[x-1][y])//向上移動
arr[--x][y]=++sum;
while(y+1<n&&!arr[x][y+1])//向右移動
arr[x][++y]=++sum;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",arr[i][j]);
printf("\n");
}
return 0;
}
蛇形矩陣
題目描述
yyf玩一個數字遊戲,取個n行n列數字矩陣(其中n爲不超過100的奇數),數字的填補方法爲:在矩陣中心從1開始以逆時針方向繞行,逐圈擴大,直到n行n列填滿數字,請輸出該n行n列正方形矩陣以及其的對角線數字之和.
輸入描述
n(即n行n列)
輸出描述
n+1行,n行爲組成的矩陣,最後一行爲對角線數字之和
樣例輸入
3
樣例輸出
5 4 3
6 1 2
7 8 9
25
這道題是逆時針地從內往外填數。
可以看出的規律是:先向右移動一格,向上移動一格。向左兩格,向下兩格。向右三格,向上三格…
從起點開始移動,先移動兩次一格,再移動兩次兩格,再移動兩次三格,再移動兩次四格…
#include <stdio.h>
#include <string.h>
using namespace std;
int main(void)
{
int n,sum=0,ans=0;
int num=1,t=num;
int arr[105][105];
scanf("%d",&n);
int x=n/2,y=n/2;//行列
memset(arr,0,sizeof(arr));
arr[x][y]=++sum;//填入1
while(sum<n*n)
{
//沒有超出矩陣的範圍,且元素爲0時
while(y+1<n&&!arr[x][y+1]&&t--)//向右移動
arr[x][++y]=++sum;
t=num;
while(x-1>=0&&!arr[x-1][y]&&t--)//向上移動
arr[--x][y]=++sum;
t=++num;
while(y-1>=0&&!arr[x][y-1]&&t--)//向左移動
arr[x][--y]=++sum;
t=num;
while(x+1<n&&!arr[x+1][y]&&t--)//向下移動
arr[++x][y]=++sum;
t=++num;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
printf("%d ",arr[i][j]);
printf("%d\n",arr[i][n-1]);
}
for(int i=0;i<n;i++)
{
if(i==n/2)
ans++;
else
ans+=arr[i][n/2]*2;
}
printf("%d\n",ans);
return 0;
}
楊輝三角
Description
還記得中學時候學過的楊輝三角嗎?具體的定義這裏不再描述,你可以參考以下的圖形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
Input
輸入數據包含多個測試實例,每個測試實例的輸入只包含一個正整數n(1<=n<=30),表示將要輸出的楊輝三角的層數。
Output
對應於每一個輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開,每一個楊輝三角後面加一個空行。
Sample Input
2
3
Sample Output
1
1 1
1
1 1
1 2 1
#include<stdio.h>
int main(void)
{
int n,arr[35][35];
for(int i=1;i<=30;i++)
{
for(int j=1;j<=i;j++)
{
//如果是第一個數或最後一個數
if(j==1||j==i)
arr[i][j]=1;
else
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
}
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
printf("%d ",arr[i][j]);
//輸出每行的最後一個數
printf("%d\n",arr[i][i]);
}
}
return 0;
}