一、 汉诺塔问题
1递归法:
# include<stdio.h>
# include<stdlib.h>
void Move(int n,char a,char b,char c)
{
if(n==1)
{
printf("只有一个盘子,直接从a移动到c:%c->%c\n",a,c);
}
else
{
Move(n-1,a,c,b);
printf("将a上的n-1个盘子,借助c,移动到b上");
printf("将最后一个盘子从a移动到c上:%c->%c\n",a,c);
Move(n-1,b,a,c);
printf("将b上的n-1个盘子借助a移动到c上");
}
}
int main()
{
int n=0;
printf("请输入要移动的块数\n");
scanf("%d",&n);
Move(n,'a','b','c');
return 0;
}结果:
# include<stdio.h>
# include<stdlib.h>
//打印出每一步的路径
void Move(char a,char c)
{
printf("%c->%c\n",a,c);
}
void Hanoi(int n,char a,char b,char c,int *time)
{
if(n>=1)
{
Hanoi(n-1,a,b,c,time);
Move(a,c);
(*time)++;
Hanoi(n-1,b,a,c,time);
}
}
int main()
{
int n=0;
int time=0;
printf("请输入要移动的块数");
scanf("%d",&n);
printf("%d个盘的移动方法是:",n);
printf("\n");
Hanoi(n,'a','b','c',&time);
return 0;
}
# include<stdio.h>
# include<stdlib.h>
# define MAX 10 //栈的最大深度
int c=1;//表示目前移动步数
struct Hanoi{//存储汉诺塔的结构,包括盘的数目和三个盘的名称
int n;
char a,b,c;
};
void Move(char a,char n,char b)//移动函数,表示把某个盘从某根针移动到另一根针
{
printf("%d->%dfrom%c->%c\n", c++,n,a,b);
}
void Hanoi(int n,char a,char b,char c)//递归
{
if(n==1)
{
Move(a,1,b);
}
else
{
Hanoi(n-1, a,c,b);
Move(a,n,c);
Hanoi(n-1,b,a,c);
}
}
void Push(struct Hanoi *p,int top,char a,char b,char c,int n)
{
p[top+1].n=n-1;
p[top+1].a=a;
p[top+1].b=b;
p[top+1].c=c;
}
void Unreverse_Hanoi(struct Hanoi *p)//非递归
{
int top=0;
while(top>=0){
while(p[top].n>1){
Push(p,top,p[top].a,p[top].b,p[top].c,p[top].n);
top++;
}
if(p[top].n==1){
Move(p[top].a,1,p[top].c);
top--;
}
if(top>=0){
Move(p[top].a,p[top].n,p[top].c);
top--;
Push(p,top,p[top].b,p[top].a,p[top].c,p[top].n);
top++;
}
}
}
int main()
{
int i;
printf("递归\n");
Hanoi(3,'a','b','c');
printf("非递归\n");
struct Hanoi p[MAX];
c=1;
p[0].n=3;
p[0].a='a';
p[0].b='b';
p[0].c='c';
Unreverse_Hanoi(p);
system("pause");
return 0;
}
二、残缺棋盘
tr子棋盘左上角方格所在行
tc子棋盘左上角方格所在列
dr残缺方块所在行
dc残缺方块所在列
size棋盘的行数或列数
# include<stdio.h>
# include<stdlib.h>
int amount=0,Board[100][100];
void Cover(int tr,int tc,int dr,int dc,int size)
{
int s,t;
if(size<2) return;
amount=amount+1;
t=amount;
s=size/2;
if(dr<tr+s&&dc<tc+s)
{
Cover(tr,tc,dr,dc,s);
Board[tr+s-1][tc+s]=t;
Board[tr+s][tc+s-1]=t;
Board[tr+s][tc+s]=t;
Cover(tr,tc+s,tr+s-1,tc+s,s);
Cover(tr+s,tc,tr+s,tc+s-1,s);
Cover(tr+s,tc+s,tr+s,tc+s,s);
}
else if(dr<tr+s && dc>=tc+s)
{
Cover(tr,tc+s,dr,dc,s);
Board[tr+s-1][tc+s-1]=t;
Board[tr+s][tc+s-1]=t;
Board[tr+s][tc+s]=t;
Cover(tr,tc,tr+s-1,tc+s-1,s);
Cover(tr+s,tc,tr+s,tc+s-1,s);
Cover(tr+s,tc+s,tr+s,tc+s,s);
}
else if(dr>=tr+s && dc<tc+s)
{
Cover(tr+s,tc,dr,dc,s);
Board[tr+s-1][tc+s-1]=t;
Board[tr+s-1][tc+s]=t;
Board[tr+s][tc+s]=t;
Cover(tr,tc,tr+s-1,tc+s-1,s);
Cover(tr,tc+s,tr+s-1,tc+s,s);
Cover(tr+s,tc+s,tr+s,tc+s,s);
}
else if(dr>=tr+s && dc>=tc+s)
{
Cover(tr+s,tc+s,dr,dc,s);
Board[tr+s-1][tc+s-1]=t;
Board[tr+s-1][tc+s]=t;
Board[tr+s][tc+s-1]=t;
Cover(tr,tc,tr+s-1,tc+s-1,s);
Cover(tr,tc+s,tr+s-1,tc+s,s);
Cover(tr+s,tc,tr+s,tc+s-1,s);
}
}
void OutputBoard(int size)
{
int i=0;
int j=0;
for(;i<size;i=i+1)
for(;j<size;j=j+1){
printf("%d",Board[i][j]);
printf("\n");
}
}
void main()
{
int size=1,x,y,i,j,k;
scanf("%d",&k);
printf("\n");
for(i=1;i<=k;i=i+1) size=size*2;
printf("input incomplete pane\n");
scanf("%d %d",&x,&y);
Cover(0,0,x,y,size);
OutputBoard(size);
}