【数据结构】关于马踏棋盘(8皇后问题)
2013-12-03 17:43
363 查看
#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACK_ADD_SIZE 10 //存储空间分配增量 typedef struct adress { int x; int y; int di; //表示8个方向 }AD; typedef struct { AD *base; //构造前和销毁后,base=NULL AD *top; //栈顶指针 int stacksize; //当前已分配存储空间,元素为单位 }SqStack; void InitStack(SqStack *s) //初始化栈 { s->base = (AD*)malloc(STACK_INIT_SIZE*sizeof(AD)); if(!(s->base)) exit(1); //分配失败程序结束 s->top = s->base; s->stacksize = STACK_INIT_SIZE; } AD GetTop(SqStack s) //取得栈顶元素 { if(s.top == s.base) exit(1);//栈内无元素 return *(s.top-1); } void Push(SqStack *s,AD e) //入栈 { if(s->top - s->base >= s->stacksize) //栈满追加存储空间 { s->base = (AD*)realloc(s->base, (s->stacksize+STACK_ADD_SIZE)*sizeof(AD)); if(!s->base) exit(1);//分配失败 s->top = s->base + s->stacksize; //指向刚刚为满时 s->stacksize += STACK_ADD_SIZE; } *(s->top++) = e; } AD Pop(SqStack &s) //出栈 { if(s.top == s.base) exit(1); //为空时退出 --s.top; return *(s.top); } void Display(SqStack *s) //显示栈元素 { AD *q; q = s->top-1; while(q>=s->base) { printf("(%d,%d)-",q->x,q->y); q--; } printf("\n"); } /*void DestroyStack(SqStack *s) //销毁栈 { free(s->base); printf("Destroy ok!\n"); }*/ /************************************************* ************************************************** *************************************************/*以上为栈的基本操作*/ void initBoard(int Board[][8])
//初始化棋盘 { int i,j; for(i=0;i<8;i++) for(j=0;j<8;j++) Board[i][j]=0; } ////////////////////////////////////////////////// void show(int Board[][8])
//打印行走后的棋盘 { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) printf("%3d",Board[i][j]); putchar('\n'); } } //////////////////////////////////////////////////// int stackempty(SqStack stack) { if(stack.top==stack.base) return 1; else return 0; } ///////////////////////////////////////////////////// int pass(int board[][8],AD adress) { if(adress.x<8&&adress.x>=0&&adress.y<8&&adress.y>=0 &&board[adress.x][adress.y]==0) return 1; else return 0; } ////////////////////////////////////////////////////// void Traverse(int board[][8],AD &adress) { int HTry1[8]={-2,-1,1,2,2,1,-1,-2}; int HTry2[8]={1,2,2,1,-1,-2,-2,-1}; SqStack stack; int count=0; InitStack(&stack); adress.di=0;//di=0~8 8表示没路 do { if(pass(board,adress)) //adress点可走 { board[adress.x][adress.y]=++count; Push(&stack,adress); printf("加入栈顶的坐标为(%d,%d)\n%d",adress.x,adress.y,count); if(count==64) exit(0);//遍历完成 else { adress.x+=HTry1[adress.di]; adress.y+=HTry2[adress.di]; adress.di=0; }//else }//if else { if(!stackempty(stack)) { adress=Pop(stack); adress.di++; while(adress.di==8&&!stackempty(stack)) { board[adress.x][adress.y]=0; adress=Pop(stack); adress.di++; count--; }//while if(adress.di<8) { Push(&stack,adress); adress.x+=HTry1[adress.di]; adress.y+=HTry2[adress.di]; adress.di=0; }//if }//if }//else }while(count<64);//(!stackempty(stack)); } //////////////////////////////////////////////////////////// void main() { AD initadress; int Board[8][8]; int HTry1[8]={-2,-1,1,2,2,1,-1,-2}; int HTry2[8]={1,2,2,1,-1,-2,-2,-1}; initBoard(Board); printf("please inputs the initial position :\n"); do { scanf("%d%d",&initadress.x,&initadress.y); if(initadress.x>=8||initadress.x<0|| initadress.y>=8||initadress.y<0) printf("输入的范围不正确,请重新输入:\n"); }while(initadress.x>=8||initadress.x<0|| initadress.y>=8||initadress.y<0); Traverse(Board,initadress); printf("\n"); printf("\n遍历后的棋盘:\n"); show(Board); system ("pause"); }
相关文章推荐
- C语言-数据结构-递归求解实例-8皇后问题
- python数据结构学习笔记-2017-01-08-01-N皇后问题、迷宫问题和跳马问题的递归解决
- 马踏棋盘问题
- 关于N皇后问题高效试探回溯算法的分析
- [数据结构] N皇后问题
- 【数据结构】关于堆栈等数据结构的问题
- 6-11-N皇后问题-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
- M*N棋盘上的K皇后问题
- C语言-数据结构-骑士周游-马踏棋盘问题-源代码
- N-Queens N皇后问题 深搜 关于效率优化(重重)
- poj 1321 棋盘问题 【dfs】【n皇后变形】
- 【数据结构】算法6.16 N皇后问题
- 【数据结构】一个关于用快慢指针处理循环链表的有趣小问题
- dfs棋盘问题,皇后 POJ1321
- 关于N皇后问题高效试探回溯算法的分析
- 数据结构中关于链表的一个简单问题
- 【数据结构】马踏棋盘问题
- 【POJ】1321-棋盘问题 n皇后、dfs
- 关于数据结构导出的问题
- POJ - 1321 棋盘问题 n皇后问题(二进制版本)