C語言練習題 遞迴

2021-10-04 14:58:25 字數 4393 閱讀 5926

會下西洋棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上(有8 * 8個方格),使它們誰也不能被吃掉!這就是著名的八皇后問題。

對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a=b1b2…b8,其中b為相應擺法中第i行皇后所處的列數。已經知道8皇后問題一共有92組解(即92個不同的皇后串)。

給出乙個數b,要求輸出第b個串。串的比較是這樣的:皇后串x置於皇后串y之前,當且僅當將x視為整數時比y小。

input

第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括乙個正整數b(1 <= b <= 92)

output

輸出有n行,每行輸出對應乙個輸入。輸出應是乙個正整數,是對應於b的皇后串。

sample input

2192

sample output

15863724

84136275

code

#include

#include

#include

int queenplace[92]

[8];

int count=0;

int board[8]

[8];

void

putqueen

(int ithqueen)

;int

main()

putqueen(0

);scanf

("%d"

,&n)

;for

(i=0

;i)return0;

}void

putqueen

(int ithqueen)

for(i=

0;i<

8;i++)}

}

逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭表示式的值,其中運算子包括+ - * /四個。

input

輸入為一行,其中運算子和運算數之間都用空格分隔,運算數是浮點數

output

《輸出為一行,表示式的值。

可直接用printf("%f\n", v)輸出表示式的值v。

sample input

* + 11.0 12.0 + 24.0 35.0
sample output

1357.000000
hint

可使用atof(str)把字串轉換為乙個double型別的浮點數。atof定義在math.h中。此題可使用函式遞迴呼叫的方法求解。

#include

#include

#include

#include

double

exp()}

intmain()

有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫乙個程式,計算你總共能夠到達多少塊黑色的瓷磚。

input

包括多個資料集合。每個資料集合的第一行是兩個整數w和h,分別表示x方向和y方向瓷磚的數量。w和h都不超過20。在接下來的h行中,每行包括w個字元。每個字元表示一塊瓷磚的顏色,規則如下

1)『.』:黑色的瓷磚;

2)『#』:白色的瓷磚;

3)『@』:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合中唯一出現一次。

當在一行中讀入的是兩個零時,表示輸入結束。

output

對每個資料集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。

如上圖所示,由正整數1, 2, 3, …組成了一棵無限大的二叉樹。從某乙個結點到根結點(編號是1的結點)都有一條唯一的路徑,比如從10到根結點的路徑是(10, 5, 2, 1),從4到根結點的路徑是(4, 2, 1),從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是(1)。對於兩個結點x和y,假設他們到根結點的路徑分別是(x1, x2, … ,1)和(y1, y2, … ,1)(這裡顯然有x = x1,y = y1),那麼必然存在兩個正整數i和j,使得從xi 和 yj開始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,… 現在的問題就是,給定x和y,要求xi(也就是yj)。

input

輸入只有一行,包括兩個正整數x和y,這兩個正整數都不大於1000。

output

輸出只有乙個正整數xi。

sample input

10 4

sample output

code

//普通演算法,沒有用到遞迴

#include

intmain()

printf

("%d"

,x);

}}

這個是遞迴

//遞迴演算法

#include

intcommon

(int x,

int y)

intmain()

把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用k表示)注意:5,1,1和1,5,1是同一種分法

input

第一行是測試資料的數目t(0<=t<=20)。以下每行均包含兩個整數

m和n,以空格分開。1<=m,n<=10。

output

對輸入的每組資料m和n,用一行輸出相應的k。

sample input

1

7 3

sample output

code

#include

intcount

(int x,

int y)

intmain()

}

C語言練習題

8 編寫乙個程式,將字串str2中的全部字元複製到字串str1中。要求 不能使用strcpy函式。12分 include definemaxlen 20 假設 str2 的長度不超過 str1 的長度 voidstrcopy char str1,char str2 intmain 9 3 20分 從...

C語言練習題

1.保密電文 某電報局的電文保密規律是將每個英文本母變成其後的第4個字母,例如a變成e,a變成e。最後四個字母 w,x,y,z或w,x,y,z 變成前四個字母 a,b,c,d或a,b,c,d 電文中的非字母字元不變。要求 輸入一行字串,輸出改變的字串。程式分析 題目程式 include intmai...

遞迴函式練習題

1 寫乙個函式,接收乙個引數,用來返回這個函式的階乘並輸出 12345 def func num if num 1 return 1 ret func num 1 return num ret print func 5 2 寫乙個函式實現斐波那契數列 1,2,3,5,8,13,21,34,55,89...