汉诺塔
#include <stdio.h>
void Hanoi(int i, char a, char b, char c);
void Move(int n, char a, char b);
int main()
{
int n;
printf("please input the number of disk");
scanf("%d", &n);
printf("step of move %d disks from A to B by mean of C:\n", n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
void Hanoi(int i, char a, char b, char c)
{
int n = i;
if(n == 1)
Move(n, a, b);
else
{
Hanoi(n - 1, a, c, b); // A -> C
Move(n, a, b); // A -> B
Hanoi(n - 1, c, b, a); // C -> B
}
}
void Move(int n, char a, char b)
{
printf("move %d :from %c to %c \n", n, a, b);
}
骑士游历
【骑士游历问题】
设有一个m×n的棋盘(2≤m≤50,2≤n≤50),在棋盘上任一点有一个中国象棋“马”,马走的规则为:马走日字;马只能向右走。当m,n给出后,同时给出马起始的位置和终点的位置,试找出从起点到终点所有路径的数目。
输入:
m,n,x1,y1,x2,y2 (分别表示m,n、起点坐标和终点坐标)
输出:
路径数目(若不存在,则输出0)
八皇后(回溯法)
电子老鼠闯迷宫(递归算法)
Fibonacci(兔子繁殖)
#include<stdio.h>
int fib(int n);
int main()
{
int n, i;
scanf("%d", &n);
for (i = 0; i <= n; i++)
{
printf("fib(%d)=%d\n", i, fib(i));
}
return 0;
}
int fib(int n)
{
if (n ==0 ) return 0;
else if(n ==1) return 1;
else
{
return fib(n-1) + fib(n-2);
}
}
辗转相除(迭代)
#include <stdio.h>
int MaxCommonFactor(int a, int b);
int main()
{
int a, b, x;
printf("Input a,b:");
scanf("%d,%d", &a, &b);
x =MaxCommonFactor(a, b);
if (x != -1)
{
printf("MaxCommonFactor = %d\n", x);
}
else
{
printf("Input error!\n");
}
return 0;
}
//函数功能: 计算两个正整数的最大公约数,-1表示没有最大公约数
int MaxCommonFactor(int a, int b)
{
int r;
if (a<=0 || b<=0) return -1; // 保证输入的参数为正整数
do{
r = a % b;
a = b;
b = r;
}while (r != 0);
return a;
}