- 編寫一個(gè)遞歸函數(shù)金句,實(shí)現(xiàn)將輸入的任意長度的字符串反向輸出的功能泪勒。例如輸入字符串ABC栅组,則輸出字符串CBA钮糖。
代碼實(shí)現(xiàn):
void print(){
char a;
scanf("%c", &a);
if(a != '#') print();
if(a != '#') printf("%c", a);
}
- 漢諾塔問題
一位法國數(shù)學(xué)家曾編寫過一個(gè)印度的古老傳說:在世界中心貝拿勒斯的圣廟里梅掠,一塊黃銅板上插著三根寶時(shí)針。印度教的主神梵天在創(chuàng)造世界的時(shí)候店归,在其中一根針上從下到上地穿好了由大到小的64片金片阎抒,這就是所謂的漢諾塔。不論白天黑夜消痛,總有一個(gè)僧侶在按照下面的法則移動(dòng)這些金片:一次只移動(dòng)一片且叁,不管在那根針上,小片必須在大片上面秩伞。
僧侶們語言逞带,但所有的金片都從梵天穿好的那根針上移到另外一根針時(shí),世界就將在一聲霹靂中消滅纱新,而梵塔展氓,廟宇和眾生也都將同歸于盡。
問題的實(shí)現(xiàn)主要考慮下面三個(gè)步驟:
- 先將前63個(gè)盤子移動(dòng)到Y(jié)上怒炸,確保大盤在小盤下带饱。
- 再將最底下的64個(gè)盤子移動(dòng)到Z上。
- 最后將Y上的63個(gè)盤子移動(dòng)到Z上。
代碼實(shí)現(xiàn)如下:
#include <stdafx.h>
#include <stdio.h>
void hannuotai(int n, char A, char B, char C) {
/*
如果是1個(gè)盤子
直接將A柱子上的盤子從A移動(dòng)到C
否則
將A柱子上的n-1個(gè)盤子借助C移動(dòng)到B
直接將A柱子上的盤子從A移動(dòng)到C
最后將B柱子上的n-1個(gè)盤子借助A移動(dòng)到C
*/
if (1 == n)
{
printf("將編號(hào)為%d的盤子直接從%c柱子移動(dòng)到%c柱子\n", n, A, C);
}
else
{
hannuotai(n - 1, A, C, B);
printf("將編號(hào)為%d的盤子直接從%c柱子移動(dòng)到%c柱子\n", n, A, C);
hannuotai(n - 1, B, A, C);
}
}
int main(void) {
char ch1 = 'A';
char ch2 = 'B';
char ch3 = 'C';
int n;
printf("請(qǐng)輸入要移動(dòng)盤子的個(gè)數(shù):");
scanf_s("%d", &n);
hannuotai(n, 'A', 'B', 'C');
getchar();
getchar();
return 0;
}
- 八皇后問題
這個(gè)問題是十九世紀(jì)著名的數(shù)學(xué)家高斯1850年提出:
在8x8格的國際象棋上擺放八個(gè)皇后勺疼,使其不能互相攻擊教寂,即在任意兩個(gè)皇后都不能處于同一行,同一列或同一斜線上执庐,問有多少種擺法酪耕。
正確答案是92種擺法。
其中一種解法如下:
代碼實(shí)現(xiàn):
#include<stdafx.h>
#include<stdio.h>
int count = 0;
int notDanger(int row, int j, int(*chess)[8]) {
int i, k, flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0, flag5 = 0;
//判斷列方向
for (i = 0; i < 8; i++)
{
if (*(*(chess + i) + j) != 0)
{
flag1 = 1;
break;
}
}
//判斷左上方
for (i = row, k = j; i >= 0 && k >= 0; i--, k--)
{
if (*(*(chess + i) + k) != 0)
{
flag2 = 1;
break;
}
}
//判斷右下方
for (i = row, k = j; i < 8 && k < 8; i++, k++)
{
if (*(*(chess + i) + k) != 0)
{
flag3 = 1;
break;
}
}
//判斷右上方
for (i = row, k = j; i >= 0 && k < 8; i--, k++)
{
if (*(*(chess + i) + k) != 0)
{
flag4 = 1;
break;
}
}
//判斷左上方
for (i = row, k = j; i < 8 && k >= 0; i++, k--)
{
if (*(*(chess + i) + k) != 0)
{
flag5 = 1;
break;
}
}
if (flag1 || flag2 || flag3 || flag4 || flag5)
{
return 0;
}
else
{
return 1;
}
}
//參數(shù)row:表示起始行
//參數(shù)n:表示列數(shù)
//參數(shù)(*chess)[8]:表示指向棋盤每一行的指針
void EightQueen(int row, int n, int(*chess)[8]) {
int chess2[8][8], i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
chess2[i][j] = chess[i][j];
}
}
if (8 == row)
{
printf("第 %d 種", count + 1);
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
printf("%d", *(*(chess2 + i) + j));
}
printf("\n");
}
count++;
}
else
{
//判斷這個(gè)位置是否有危險(xiǎn)
//如果沒有危險(xiǎn)轨淌?繼續(xù)往下判斷
for (j = 0; j < n; j++)
{
if (notDanger(row, j, chess)) {//判斷這個(gè)位置是否有危險(xiǎn)
for (i = 0; i < 8; i++)
{
*(*(chess2 + row) + i) = 0;
}
*(*(chess2 + row) + j) = 1;
EightQueen(row + 1, n, chess2);
}
}
}
}
int main() {
int chess[8][8], i, j;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
chess[i][j] = 0;
}
}
EightQueen(0, 8, chess);
printf("總共有%d種解決方法!\n", count);
getchar();
return 0;
}