数据结构之马踏棋盘

来源:互联网 发布:linux查询cpu个数 编辑:程序博客网 时间:2024/04/28 21:15

经过优化


#include<cstdio>#include<cstring>#include<iostream>#include<cstdlib>#include<algorithm>#include<Windows.h>using namespace std;#define STACK_INIT_SIZE 100 //存储空间出事分配量 #define STACK_INCRENMENT 10  // 存储空间分配增量 #define MAXN 8int dir[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};int vis[MAXN+5][MAXN+5];int map[MAXN+5][MAXN+5];struct Order{int pos;int d;};bool cmp(Order a,Order b){return a.d<b.d;}bool judge(int x,int y){if(x>=1&&x<=MAXN&&y>=1&&y<=MAXN&&!vis[x][y])return 1;return 0;}struct Node{int x,y,d;int cnt;Order order[8];int flag;//判断是否排序过 Node(int xx=1,int yy=1,int dd=-1){x=xx;y=yy;d=dd;flag=0;}void gerOrder()//出度排序 {cnt=0;for(int i=0;i<8;i++){int tx=x+dir[i][0];int ty=y+dir[i][1];if(judge(tx,ty)){order[cnt].pos=i;order[cnt].d=0;for(int j=0;j<8;j++){int ttx=tx+dir[j][0];int tty=ty+dir[j][1]; if(judge(ttx,tty))order[cnt].d++;}cnt++;}}sort(order,order+cnt,cmp);}};struct Stack{Node *base;  // 在栈构造之前和小会之后,base的值是NULL Node *top;    // 栈顶指针 int stackSize;//当前分配的空间,以元素为单位 int stackNum; // 栈内元素数Stack(){base=(Node*)malloc(STACK_INIT_SIZE*sizeof(Node));top=base;stackSize=STACK_INIT_SIZE;stackNum=0;}bool empty(){if(top==base)return 1;return 0;}Node& GetTop()//返回后可直接修改 {if(top==base){cout<<"栈内无元素1"<<endl;exit(0);}return (*top);}void Pop(){if(top==base){cout<<"栈内无元素2"<<endl;exit(0);}--top;--stackNum;}void Push(Node e){if(top-base>=stackSize-1)//栈满,追加存储空间   {base=(Node *)realloc(base,(stackSize+STACK_INCRENMENT)*sizeof(Node));top=base+stackSize;stackSize+=STACK_INCRENMENT;}stackNum++;*(++top)=e;}};void print(){cout<<endl;for(int i=1;i<=MAXN;i++){for(int j=1;j<=MAXN;j++){printf("%02d ",map[i][j]);}cout<<endl;}}bool search(int n,int m){Stack S;S.Push(Node(n,m,-1));vis[n][m]=1;int flag=0;while(!S.empty()){Node& now=S.GetTop();if(now.flag==0){now.flag=1;now.gerOrder();}map[now.x][now.y]=S.stackNum;if(S.stackNum==MAXN*MAXN)return 1;for(now.d++;now.d<now.cnt;now.d++){int tx=now.x+dir[now.order[now.d].pos][0];int ty=now.y+dir[now.order[now.d].pos][1];if(judge(tx,ty)){vis[tx][ty]=1;S.Push(Node(tx,ty,-1));break;}}if(now.d==now.cnt){S.Pop();map[now.x][now.y]=0;vis[now.x][now.y]=0;}//Sleep(10);//print();//system("cls");}free(S.base);return 0;}int main(){ //freopen("f://out.txt", "w", stdout);  int n,m;//马的起点位置 while(cin>>n>>m){memset(vis,0,sizeof(vis));if(search(n,m))print();elsecout<<"无解"<<endl;}return 0;}


原创粉丝点击