一、 汉诺塔问题

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;

}

结果:
汉诺塔和残缺棋盘
2、 非递归

# 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);

}

 

结果
汉诺塔和残缺棋盘

 

相关文章:

  • 2022-12-23
  • 2021-10-11
  • 2022-02-19
  • 2022-12-23
  • 2022-12-23
  • 2021-05-05
猜你喜欢
  • 2022-01-01
  • 2021-09-09
  • 2022-01-07
  • 2021-07-01
  • 2022-12-23
  • 2021-10-21
  • 2022-12-23
相关资源
相似解决方案