一、汉诺塔
#include "stdio.h"
#include "stdlib.h"
void move(int n, char x, char y, char z)
{
if(1 == n)
{
printf("%c----->%c\n", x, z);
}
else
{
move(n - 1, x, z, y); // 将 n - 1 个盘子从x, 借助 z, 移到y
printf("%c----->%c\n", x, z); // 将 第 n 个盘子从 x 移到z
move(n - 1, y, x, z); // 将 n - 1 个盘子从y, 借助 x, 移到z
}
}
int main()
{
int n;
int list[10];
printf("please hannuo ta cengshu: ");
scanf("%d", &n);
printf("move mothod: \n");
move(n, 'X', 'Y', 'Z');
return 0;
}
二、斐波那契数列
#include "stdio.h"
#define MAXSIZE 40
void IterFib(void)
{
int i;
int a[MAXSIZE];
a[0] = 0;
a[1] = 1;
printf("%d %d",a[0], a[1]);
for(i = 2; i < MAXSIZE; i++)
{
a[i] = a[i - 1] + a[i - 2];
printf(" %d",a[i]);
}
printf("\n");
}
int Fib(int i)
{
if(i < 2)
return i == 0 ? 0 : 1;
return Fib(i - 1) + Fib(i -2);
}
void FibResult(void)
{
int j;
for(j = 0; j < 40; j ++)
{
printf("%d ", Fib(j));
}
printf("\n");
}
void print(void)
{
char a;
scanf("%c", &a);
if(a != '\n')
print();
if(a != '\n')
printf("%c", a);
}
void main()
{
IterFib();
FibResult();
print();
printf("\n");
return 0;
}
三、二分查找
#include "stdio.h"
int p2p(int high, int low, int *l, int x)
{
int mid;
if (x < l[low] || x > l[high] || l[low] > l[high])
{
return -1;
}
mid = (int)(high + low) / 2;
if(l[mid] == x)
return mid;
else if(l[mid] > x)
return p2p(mid, low, l, x);
else
return p2p(high, mid, l, x);
}
void P2pResult(int num)
{
int a[11] = {1, 3, 6, 8, 34, 77, 79, 123, 456, 500};
int flag;
flag = p2p(9, 0, &a, num);
if(flag < 0)
printf("error: number is not found\n");
else
printf("the number index is %d\n", flag);
}
void main()
{
P2pResult(3);
return 0;
}
四、八皇后问题
#include "stdio.h"
int count = 0;
/****************************
row: 起始行
n: 列
(*chess)[8]:每一行指针
*****************************/
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;
}
}
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");
}
printf("\n");
count ++;
}
else
{
/* 判断是否有危险 */
for (j = 0; j < n; j++)
{
if (notDanger(row, j , chess))
{
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\n", count);
return 0;
}