1. 程式人生 > >簡單遞迴之蛇形填數

簡單遞迴之蛇形填數

時間限制:1000 ms  |  記憶體限制:65535 KB

【問題描述】

peter喜歡玩字母遊戲,於是他編寫了一個有趣的遊戲。遊戲規則是在一個 (N-1) * N的表格裡填寫字母,規則:對於每個輸入的N,由 (N-1) * N的字母區域的左上角開始,從字母A開始逆時針填充一個字母區域,乘積若超過26繼續由新一組的A、B、C„„填充,不要求輸出邊框。

【輸入】

多組測試資料(資料量在100組以內)。每組測試資料只有一行為一個整數N(1<=N<=30),表示表格的寬度。

【輸出】

對於每組輸入資料,輸出N-1行,為填完的表格(N-1行,每行N個整數,每個數字之間用空格隔開)。

【樣例輸入】

5

【樣例輸出】

代表一個4*5的順時針旋轉的字母區域,其樣式如下:  

A B C D E

N O P Q F 

M T S R G 

L K J I H

程式碼如下:

#include<stdio.h>
char p[40][40];
void fill(char ch,int begin,int size)
{
if(size==0)
return ;
if(size==1)
{
p[begin][begin]=ch;
return ;}
int i=0;
int h=begin,v=begin;
p[h][v]=ch;
ch++;
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
         h++;
p[h][v]=ch;
ch='A';
}
else
{
h++;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-1;i++)
{
if(ch=='Z')
{
         v++;
p[h][v]=ch;
ch='A';
}
else
{
v++;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
         h--;
p[h][v]=ch;
ch='A';
}
else
{
h--;
p[h][v]=ch;
ch++;
}
}
for(i=0;i<size-2;i++)
{
if(ch=='Z')
{
       v--;
p[h][v]=ch;
ch='A';
}
else
{
v--;
p[h][v]=ch;
ch++;
}
}
fill(ch,v,size-2);
}
int main(void)
{





int n,h,v;
while(scanf("%d",&n)!=EOF)
{
fill('A',0,n);
for(h=0;h<n-1;h++)
{
for(v=0;v<n;v++)
printf("%c ",p[h][v]);
printf("\n");
}
}
return 0;
}


         此問題是一個典型的適合用遞迴進行解答的問題,因為通過觀察可以發現,在字母矩陣的每一層(每一圈為一層)中,運算方式是一樣的,因此可通過一個遞迴函式實現此種運算的重複運算。