#include<stdio.h>
int djc(int n);
int djc(int n){
return n ? n*djc(n-1) : 1;
}
void main(void){
int n;
printf("请输入一个小于13的正整数:");
scanf("%d", &n);
printf("%d! = %d\n", n, djc(n));
}
#include<stdio.h>
int Fibonacci(int n);
int Fibonacci(int n){
int res;
if(n <= 2)
res = 1;
else
res = Fibonacci(n-1) + Fibonacci(n-2);
return res;
}
void main(void){
int n;
for(n = 1; n < 30; n++){
printf("(%d:)%d\n", n, Fibonacci(n));
}
}
//递归实现字符串逆序
#include<stdio.h>
#include<string.h>
void fun1(char *str, int len); //从外面向里面交换
void fun2(char *str, int len); //从里面向外面交换
void fun3(char *old, char *str, int len, int thisTime);
//为了输出一些别的信息
//加old指针是为了每次都可以重头开始输出
//加thisTime是为了知道这是第几次进行的交换
void fun3(char *old, char *str, int len, int thisTime){
/*
0 1 2 3 4 5 6 7 8
a b c d e f g h \0
e d 第一次修改
f c
g b
h a
*/
char tmp;
if(len > 0){
fun3(old, str+1, len-2, thisTime+1); //这个地方不可以用thisTime++,自己再研究一下递归中++的问题
tmp = str[0];
str[0] = str[len-1];
str[len-1] = tmp;
//printf("%s\n", str); //如果输出str的话,则不能重头开始输出
printf("第%d次调用:%s\n", thisTime, old);
}
}
void fun2(char *str, int len){
char tmp;
if(len > 0){
fun2(str+1, len-2);
tmp = str[0];
str[0] = str[len-1];
str[len-1] = tmp;
}
}
void fun1(char *str, int len){
char tmp;
if(len > 0){
tmp = str[0];
str[0] = str[len-1];
str[len-1] = tmp;
fun1(str+1, len-2);
}
}
int main(){
char s1[80] = "abcdefgh";
char s2[80] = "abcdefgh";
char s3[80] = "abcdefgh";
//printf("strlen(s) = %d\n", strlen(s)); // "abcdefgh" 8
//printf("strlen(s+1) = %d\n", strlen(s+1));
fun1(s1, strlen(s1));
puts(s1);
fun2(s2, strlen(s2));
puts(s2);
printf("******\n");
fun3(s3, s3, strlen(s3), 1);
}
//移动n个盘子要经历2^n-1步
#include<stdio.h>
void Hanoii(int n, char source, char aux, char des);
void Hanoii1(int n, char source, char aux, char des); //朱老师的写法
void Hanoii2(int n, char source, char aux, char des); //朱老师的写法 为了看进行了多少次操作
void Hanoii2(int n, char source, char aux, char des){
//静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
//静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。
static int times = 0;
if(n > 0){
Hanoii2(n-1, source, des, aux);
printf("(%2d)%d, %c->%c \n", ++times, n, source, des);
Hanoii2(n-1, aux, source, des);
}
}
void Hanoii1(int n, char source, char aux, char des){
if(n > 0){
Hanoii1(n-1, source, des, aux);
printf("%d, %c->%c \n", n, source, des);
Hanoii1(n-1, aux, source, des);
}
}
void Hanoii(int n, char source, char aux, char des){
if(n == 1){
printf("%d, %c->%c \n", n, source, des);
}else{
Hanoii(n-1, source, des, aux);
printf("%d, %c->%c \n", n, source, des);
Hanoii(n-1, aux, source, des);
}
}
int main(void){
int n;
// Hanoii(4, 'A', 'B', 'C');
// printf("\n");
// Hanoii1(4, 'A', 'B', 'C');
// printf("\n");
Hanoii2(4, 'A', 'B', 'C');
}
八皇后问题
手工过程很重要,不要一上来就写循环,写代码,要先写手工过程
代码是对手工过程的体现
very important!
//回溯法指导思想——走不通,就掉头。
//八皇后问题共92个解
/*
anan
2020.1.30
思路:定义一个栈,栈里面放皇后的列数 如果所有列都找完没有找到,则上一个皇后出栈,重新开始放上一个皇后,集回溯
*/
#include<stdio.h>
#define QUEENS 8
typedef struct QueenStack{
int col[QUEENS+1]; //虽然理论上从0开始,但是从1开始比较方便,所以这个地方要加1
int top;
}QueenStack;
bool isSafe(QueenStack qt, int i, int j);
void placeQueens(int queens);
void showQueens(QueenStack qt);
void showQueens(QueenStack qt){
//printf("当前皇后放置情况如下:\n");
//printf("qt.top = %d\n", qt.top);
for(int i = 1; i <= qt.top; i++){
printf("(%d, %d) ", i, qt.col[i]);
}
printf("\n");
}
void placeQueens(int queens){
QueenStack queenStack;
queenStack.top = 0;
int queen_i = 1;
int queen_j = 0;
bool find = true;
int tmp_j = -1;
int number = 0; //解的个数
while((queen_i)<queens+1){
//printf("\n\n******\n");
//printf("queen_i = %d\n", queen_i);
if(find == false){
queen_j = tmp_j; //回溯 从上一个皇后找到位置的下一个开始
}else{
queen_j = 0; //每次新开始一个皇后,j都要从0开始
}
while((++queen_j)<queens+1){
//printf("queen_j = %d\n", queen_j);
if(isSafe(queenStack, queen_i, queen_j)){
//printf("safe\n");
queenStack.top++;
queenStack.col[queenStack.top] = queen_j;
find = true;
queen_i++;
//showQueens(queenStack);
break;
}
}
if(queen_j==queens+1){ //这一行将所有列都找完了,没有找到合适的,需要进行回溯su
tmp_j = queenStack.col[queenStack.top];
//printf("queen_i = %d ", queen_i);
//printf("所有列找完没有\n");
queenStack.top--;
queen_i--;
find = false;
}
if(queenStack.top==queens){ //等价于queen_i == 9 //找到一个解了,继续找下一个解
number++;
printf("第%2d个解为:", number);
showQueens(queenStack);
tmp_j = queenStack.col[queenStack.top];
queenStack.top--;
queen_i--;
find = false;
}
if(queen_i == 0){ //八皇后问题共92个解,不加这个条件的话,92之后,又重复之前的进行输出,无穷无尽
break;
}
}
}
bool isSafe(QueenStack qt, int queen_i, int queen_j){
//比较的对象: (i, qt.col[i]) (queen_i, queen_j)
for(int i = 1; i < queen_i; i++){ //不同行
//printf("(i, qt.col[i])=(%d, %d) (queen_i,queen_j)=(%d, %d)\n", i, qt.col[i], queen_i, queen_j);
if(qt.col[i] == queen_j){ //不同列
return false;
}else if((queen_i-i) == (queen_j-qt.col[i])){ //不同主对角线
return false;
}else if((i+qt.col[i]) == (queen_i+queen_j)){ //不同副对角线
return false;
}
}
return true;
}
int main(){
placeQueens(QUEENS);
}
//回溯法指导思想——走不通,就掉头。
//八皇后问题共92个解
/*
anan
2020.1.30
思路:用递归的方法求解 借鉴实验书
*/
#include<stdio.h>
#define QUEENS 8
int col[QUEENS+1]; //存放皇后的列数
int count = 0; //解的个数
bool isSafe(int i, int j);
void placeQueens(int n, int k);
void showQueens(int n);
void showQueens(int n){
count++;
printf("第%2d个解为:", count);
for(int i = 1; i <= n; i++){
printf("(%d, %d) ", i, col[i]);
}
printf("\n");
}
void placeQueens(int n, int k){ //queen表示皇后的个数,k表示现在放置的是第i个皇后
int queen_i = k;
if(queen_i > n){
showQueens(n);
}else{
for(int queen_j = 1; queen_j <= n; queen_j++){
if(isSafe(queen_i, queen_j)){
col[queen_i] = queen_j;
placeQueens(n, queen_i+1);
}
}
}
}
bool isSafe(int queen_i, int queen_j){
//比较的对象: (i, col[i]) (queen_i, queen_j)
for(int i = 1; i < queen_i; i++){ //不同行
if(col[i] == queen_j){ //不同列
return false;
}else if((queen_i-i) == (queen_j-col[i])){ //不同主对角线
return false;
}else if((i+col[i]) == (queen_i+queen_j)){ //不同副对角线
return false;
}
}
return true;
}
int main(){
placeQueens(QUEENS, 1);
}
//朱老师
#include<stdio.h>
#define NUMBER 8
typedef u nsigned char boolean;
#define TRUE 1
#define FALSE 0
boolean isSafe(int (*chess)[NUMBER], int row, int col);
void showChess(int (*chess)[NUMBER]);
void eightQueens(int (*chess)[NUMBER], int row);
void eightQueens(int (*chess)[NUMBER], int row){
if(row >= NUMBER){
showChess(chess);
}else{
int col;
for(col = 0; col < NUMBER; col++){
if(isSafe(chess, row, col)){
chess[row][col] = 1;
eightQueens(chess, row+1);
chess[row][col] = 0;
}
}
}
}
void showChess(int (*chess)[NUMBER]){
int row;
int col;
static int count = 0;
printf("第%d个解:\n", ++count);
for(row = 0; row < NUMBER; row++){
for(col = 0; col < NUMBER; col++){
printf("%4d", chess[row][col]);
}
printf("\n");
}
}
boolean isSafe(int (*chess)[NUMBER], int row, int col){
int i;
int j;
for(i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--){
if(chess[i][j] == 1){
return FALSE;
}
}
for(i = row-1, j = col; i >= 0; i--){
if(chess[i][j] == 1){
return FALSE;
}
}
for(i = row-1, j = col+1; i >= 0 && j < NUMBER; i--, j++){
if(chess[i][j] == 1){
return FALSE;
}
}
return TRUE;
}
void main(void){
int eightQueen[NUMBER][NUMBER] = {0};
eightQueens(eightQueen, 0);
}
第 1个解为:(1, 1) (2, 5) (3, 8) (4, 6) (5, 3) (6, 7) (7, 2) (8, 4)
第 2个解为:(1, 1) (2, 6) (3, 8) (4, 3) (5, 7) (6, 4) (7, 2) (8, 5)
第 3个解为:(1, 1) (2, 7) (3, 4) (4, 6) (5, 8) (6, 2) (7, 5) (8, 3)
第 4个解为:(1, 1) (2, 7) (3, 5) (4, 8) (5, 2) (6, 4) (7, 6) (8, 3)
第 5个解为:(1, 2) (2, 4) (3, 6) (4, 8) (5, 3) (6, 1) (7, 7) (8, 5)
第 6个解为:(1, 2) (2, 5) (3, 7) (4, 1) (5, 3) (6, 8) (7, 6) (8, 4)
第 7个解为:(1, 2) (2, 5) (3, 7) (4, 4) (5, 1) (6, 8) (7, 6) (8, 3)
第 8个解为:(1, 2) (2, 6) (3, 1) (4, 7) (5, 4) (6, 8) (7, 3) (8, 5)
第 9个解为:(1, 2) (2, 6) (3, 8) (4, 3) (5, 1) (6, 4) (7, 7) (8, 5)
第10个解为:(1, 2) (2, 7) (3, 3) (4, 6) (5, 8) (6, 5) (7, 1) (8, 4)
第11个解为:(1, 2) (2, 7) (3, 5) (4, 8) (5, 1) (6, 4) (7, 6) (8, 3)
第12个解为:(1, 2) (2, 8) (3, 6) (4, 1) (5, 3) (6, 5) (7, 7) (8, 4)
第13个解为:(1, 3) (2, 1) (3, 7) (4, 5) (5, 8) (6, 2) (7, 4) (8, 6)
第14个解为:(1, 3) (2, 5) (3, 2) (4, 8) (5, 1) (6, 7) (7, 4) (8, 6)
第15个解为:(1, 3) (2, 5) (3, 2) (4, 8) (5, 6) (6, 4) (7, 7) (8, 1)
第16个解为:(1, 3) (2, 5) (3, 7) (4, 1) (5, 4) (6, 2) (7, 8) (8, 6)
第17个解为:(1, 3) (2, 5) (3, 8) (4, 4) (5, 1) (6, 7) (7, 2) (8, 6)
第18个解为:(1, 3) (2, 6) (3, 2) (4, 5) (5, 8) (6, 1) (7, 7) (8, 4)
第19个解为:(1, 3) (2, 6) (3, 2) (4, 7) (5, 1) (6, 4) (7, 8) (8, 5)
第20个解为:(1, 3) (2, 6) (3, 2) (4, 7) (5, 5) (6, 1) (7, 8) (8, 4)
第21个解为:(1, 3) (2, 6) (3, 4) (4, 1) (5, 8) (6, 5) (7, 7) (8, 2)
第22个解为:(1, 3) (2, 6) (3, 4) (4, 2) (5, 8) (6, 5) (7, 7) (8, 1)
第23个解为:(1, 3) (2, 6) (3, 8) (4, 1) (5, 4) (6, 7) (7, 5) (8, 2)
第24个解为:(1, 3) (2, 6) (3, 8) (4, 1) (5, 5) (6, 7) (7, 2) (8, 4)
第25个解为:(1, 3) (2, 6) (3, 8) (4, 2) (5, 4) (6, 1) (7, 7) (8, 5)
第26个解为:(1, 3) (2, 7) (3, 2) (4, 8) (5, 5) (6, 1) (7, 4) (8, 6)
第27个解为:(1, 3) (2, 7) (3, 2) (4, 8) (5, 6) (6, 4) (7, 1) (8, 5)
第28个解为:(1, 3) (2, 8) (3, 4) (4, 7) (5, 1) (6, 6) (7, 2) (8, 5)
第29个解为:(1, 4) (2, 1) (3, 5) (4, 8) (5, 2) (6, 7) (7, 3) (8, 6)
第30个解为:(1, 4) (2, 1) (3, 5) (4, 8) (5, 6) (6, 3) (7, 7) (8, 2)
第31个解为:(1, 4) (2, 2) (3, 5) (4, 8) (5, 6) (6, 1) (7, 3) (8, 7)
第32个解为:(1, 4) (2, 2) (3, 7) (4, 3) (5, 6) (6, 8) (7, 1) (8, 5)
第33个解为:(1, 4) (2, 2) (3, 7) (4, 3) (5, 6) (6, 8) (7, 5) (8, 1)
第34个解为:(1, 4) (2, 2) (3, 7) (4, 5) (5, 1) (6, 8) (7, 6) (8, 3)
第35个解为:(1, 4) (2, 2) (3, 8) (4, 5) (5, 7) (6, 1) (7, 3) (8, 6)
第36个解为:(1, 4) (2, 2) (3, 8) (4, 6) (5, 1) (6, 3) (7, 5) (8, 7)
第37个解为:(1, 4) (2, 6) (3, 1) (4, 5) (5, 2) (6, 8) (7, 3) (8, 7)
第38个解为:(1, 4) (2, 6) (3, 8) (4, 2) (5, 7) (6, 1) (7, 3) (8, 5)
第39个解为:(1, 4) (2, 6) (3, 8) (4, 3) (5, 1) (6, 7) (7, 5) (8, 2)
第40个解为:(1, 4) (2, 7) (3, 1) (4, 8) (5, 5) (6, 2) (7, 6) (8, 3)
第41个解为:(1, 4) (2, 7) (3, 3) (4, 8) (5, 2) (6, 5) (7, 1) (8, 6)
第42个解为:(1, 4) (2, 7) (3, 5) (4, 2) (5, 6) (6, 1) (7, 3) (8, 8)
第43个解为:(1, 4) (2, 7) (3, 5) (4, 3) (5, 1) (6, 6) (7, 8) (8, 2)
第44个解为:(1, 4) (2, 8) (3, 1) (4, 3) (5, 6) (6, 2) (7, 7) (8, 5)
第45个解为:(1, 4) (2, 8) (3, 1) (4, 5) (5, 7) (6, 2) (7, 6) (8, 3)
第46个解为:(1, 4) (2, 8) (3, 5) (4, 3) (5, 1) (6, 7) (7, 2) (8, 6)
第47个解为:(1, 5) (2, 1) (3, 4) (4, 6) (5, 8) (6, 2) (7, 7) (8, 3)
第48个解为:(1, 5) (2, 1) (3, 8) (4, 4) (5, 2) (6, 7) (7, 3) (8, 6)
第49个解为:(1, 5) (2, 1) (3, 8) (4, 6) (5, 3) (6, 7) (7, 2) (8, 4)
第50个解为:(1, 5) (2, 2) (3, 4) (4, 6) (5, 8) (6, 3) (7, 1) (8, 7)
第51个解为:(1, 5) (2, 2) (3, 4) (4, 7) (5, 3) (6, 8) (7, 6) (8, 1)
第52个解为:(1, 5) (2, 2) (3, 6) (4, 1) (5, 7) (6, 4) (7, 8) (8, 3)
第53个解为:(1, 5) (2, 2) (3, 8) (4, 1) (5, 4) (6, 7) (7, 3) (8, 6)
第54个解为:(1, 5) (2, 3) (3, 1) (4, 6) (5, 8) (6, 2) (7, 4) (8, 7)
第55个解为:(1, 5) (2, 3) (3, 1) (4, 7) (5, 2) (6, 8) (7, 6) (8, 4)
第56个解为:(1, 5) (2, 3) (3, 8) (4, 4) (5, 7) (6, 1) (7, 6) (8, 2)
第57个解为:(1, 5) (2, 7) (3, 1) (4, 3) (5, 8) (6, 6) (7, 4) (8, 2)
第58个解为:(1, 5) (2, 7) (3, 1) (4, 4) (5, 2) (6, 8) (7, 6) (8, 3)
第59个解为:(1, 5) (2, 7) (3, 2) (4, 4) (5, 8) (6, 1) (7, 3) (8, 6)
第60个解为:(1, 5) (2, 7) (3, 2) (4, 6) (5, 3) (6, 1) (7, 4) (8, 8)
第61个解为:(1, 5) (2, 7) (3, 2) (4, 6) (5, 3) (6, 1) (7, 8) (8, 4)
第62个解为:(1, 5) (2, 7) (3, 4) (4, 1) (5, 3) (6, 8) (7, 6) (8, 2)
第63个解为:(1, 5) (2, 8) (3, 4) (4, 1) (5, 3) (6, 6) (7, 2) (8, 7)
第64个解为:(1, 5) (2, 8) (3, 4) (4, 1) (5, 7) (6, 2) (7, 6) (8, 3)
第65个解为:(1, 6) (2, 1) (3, 5) (4, 2) (5, 8) (6, 3) (7, 7) (8, 4)
第66个解为:(1, 6) (2, 2) (3, 7) (4, 1) (5, 3) (6, 5) (7, 8) (8, 4)
第67个解为:(1, 6) (2, 2) (3, 7) (4, 1) (5, 4) (6, 8) (7, 5) (8, 3)
第68个解为:(1, 6) (2, 3) (3, 1) (4, 7) (5, 5) (6, 8) (7, 2) (8, 4)
第69个解为:(1, 6) (2, 3) (3, 1) (4, 8) (5, 4) (6, 2) (7, 7) (8, 5)
第70个解为:(1, 6) (2, 3) (3, 1) (4, 8) (5, 5) (6, 2) (7, 4) (8, 7)
第71个解为:(1, 6) (2, 3) (3, 5) (4, 7) (5, 1) (6, 4) (7, 2) (8, 8)
第72个解为:(1, 6) (2, 3) (3, 5) (4, 8) (5, 1) (6, 4) (7, 2) (8, 7)
第73个解为:(1, 6) (2, 3) (3, 7) (4, 2) (5, 4) (6, 8) (7, 1) (8, 5)
第74个解为:(1, 6) (2, 3) (3, 7) (4, 2) (5, 8) (6, 5) (7, 1) (8, 4)
第75个解为:(1, 6) (2, 3) (3, 7) (4, 4) (5, 1) (6, 8) (7, 2) (8, 5)
第76个解为:(1, 6) (2, 4) (3, 1) (4, 5) (5, 8) (6, 2) (7, 7) (8, 3)
第77个解为:(1, 6) (2, 4) (3, 2) (4, 8) (5, 5) (6, 7) (7, 1) (8, 3)
第78个解为:(1, 6) (2, 4) (3, 7) (4, 1) (5, 3) (6, 5) (7, 2) (8, 8)
第79个解为:(1, 6) (2, 4) (3, 7) (4, 1) (5, 8) (6, 2) (7, 5) (8, 3)
第80个解为:(1, 6) (2, 8) (3, 2) (4, 4) (5, 1) (6, 7) (7, 5) (8, 3)
第81个解为:(1, 7) (2, 1) (3, 3) (4, 8) (5, 6) (6, 4) (7, 2) (8, 5)
第82个解为:(1, 7) (2, 2) (3, 4) (4, 1) (5, 8) (6, 5) (7, 3) (8, 6)
第83个解为:(1, 7) (2, 2) (3, 6) (4, 3) (5, 1) (6, 4) (7, 8) (8, 5)
第84个解为:(1, 7) (2, 3) (3, 1) (4, 6) (5, 8) (6, 5) (7, 2) (8, 4)
第85个解为:(1, 7) (2, 3) (3, 8) (4, 2) (5, 5) (6, 1) (7, 6) (8, 4)
第86个解为:(1, 7) (2, 4) (3, 2) (4, 5) (5, 8) (6, 1) (7, 3) (8, 6)
第87个解为:(1, 7) (2, 4) (3, 2) (4, 8) (5, 6) (6, 1) (7, 3) (8, 5)
第88个解为:(1, 7) (2, 5) (3, 3) (4, 1) (5, 6) (6, 8) (7, 2) (8, 4)
第89个解为:(1, 8) (2, 2) (3, 4) (4, 1) (5, 7) (6, 5) (7, 3) (8, 6)
第90个解为:(1, 8) (2, 2) (3, 5) (4, 3) (5, 1) (6, 7) (7, 4) (8, 6)
第91个解为:(1, 8) (2, 3) (3, 1) (4, 6) (5, 2) (6, 5) (7, 7) (8, 4)
第92个解为:(1, 8) (2, 4) (3, 1) (4, 3) (5, 6) (6, 2) (7, 7) (8, 5)