马踏棋盘问题:
将马放入8×8棋盘中指定的某方格,马按下图所示规则进行移动。
要求每个方格只进入一次,走遍棋盘上全部64个方格。求出马的行走路线,并按求出的行走路线将数字
1,2,…,64依次填入一个8×8的方阵并输出。
特别规定,马必须按下图所示1至8的顺序进行8个不同方向的探索。
8 |
| 1 |
| |
7 |
|
|
| 2 |
|
| 马 |
|
|
6 |
|
|
| 3 |
| 5 |
| 4 |
|
这里我用的是非递归算法,栈的实例应用。
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define n 10 typedef struct { int x; int y; }Coordinate; int chessboard[8][8]={0}; Coordinate move[8]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-1,-1}}; typedef struct { int ord; Coordinate seat; int di; }SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; int InitStack(SqStack *s1) { s1->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!s1->base) exit(1); s1->top=s1->base; s1->stacksize=STACK_INIT_SIZE; return (1); } SElemType Pop(SqStack*s,SElemType m) { m=*(--s->top); return m; } int Push(SqStack *s1,SElemType m) { if(s1->top-s1->base>=s1->stacksize) { s1->base=(SElemType *)realloc(s1->base,(s1->stacksize+n)*sizeof(SElemType)); if(!s1->base) exit (1); s1->top=s1->base+s1->stacksize; s1->stacksize+=n; } *(s1->top++)=m; return 1; } int StackEmpty(SqStack *s) { if(s->base==s->top) return (1); else return (0); } int Pass(Coordinate s) { if(chessboard[s.x][s.y]==0&&(s.x<=7)&&(s.x>=0) &&(s.y<=7)&&(s.y>=0)) return (1); else return (0); } Coordinate NextPos(Coordinate s,int i) { s.x=s.x+move[i].x; s.y=s.y+move[i].y; return(s); } void knight(Coordinate start) { int curstep=0; SqStack S; SElemType e; Coordinate curpos=start; InitStack(&S); do { if(Pass(curpos)) { curstep++; chessboard[curpos.x][curpos.y]=curstep; e.seat=curpos; e.ord=curstep; e.di=0; Push(&S,e); if(curstep==64) { break; } else { curpos=NextPos(curpos,e.di);} } else { if(!StackEmpty(&S)) { Pop(&S,e); if(e.di==7) { chessboard[e.seat.x][e.seat.y]=0; } while(e.di==7&&!StackEmpty(&S)) { e=Pop(&S,e); if(e.di==7) chessboard[e.seat.x][e.seat.y]=0; curstep=e.ord; } if(e.di<7) { e.di++; Push(&S,e); curpos=NextPos(e.seat,e.di); } } } } while(!StackEmpty(&S)); } int main() { int i,j; Coordinate start; printf("请输入初始位置\n"); scanf("%d %d",&start.x,&start.y); start.x-=1; start.y-=1; knight(start); for(i=0;i<8;i++) { for(j=0;j<8;j++) printf("%4d",chessboard[i][j]); printf("\n"); } return 0; }