马踏棋盘的问题!谢谢了

ogiso_pest 2008-09-30 02:00:19
马踏棋盘:
将马随机放在国际象棋8x8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8x8的方阵,输出之。

我的算法思想:
当马处于棋盘中的任意一格时,需要查询周围符合条件的位置,则对当前位置进行出栈操作,
如果有符合条件的位置,则进栈!由于当马处于边界时,会出现超过边界的现象。所以我将地图设置为12x12的!
并且在初始化时,将越界的位置设置为1,表示这些位置已经走过!位置为0表示此位置没有走过!
在每所查找的位置满足条件(没有走过),则进行进栈操作,将此位置在地图上设置为num,
而每次所查找的位置不满足条件时,说明此条路行不通,则应该进行出站操作,则将此位置设置为0!

我按照这个思路,写了代码!但是有问题!
我也不知道到底是哪里有问题!
谢谢了~~


#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAXSIZE 12

typedef struct stack
{
int x;
int y;
int id;
struct stack *next;
}StackNode,*StackList;

void InitStack(StackList S)

{
S=(StackList)malloc(sizeof(StackNode));
S->x=0;
S->y=0;
S->next=NULL;
}

void Push(StackList S,int i,int j)
{
StackNode *temp;
temp->x=i;
temp->y=j;
temp->id=S->next->id+1;
temp->next=S->next;
S->next=temp;
}

void Pop(StackList S)
{
StackNode *temp;
temp=S->next;
S->next=temp->next;
free(temp);
}

void HorsePlay(StackList S,int **map)
{
int i,j,ti,tj,num=1;
StackNode *p;
printf("请输入你想在第几行,第几列开始:");
scanf("%d %d",&i,&j);
Push(S,i,j);
map[i][j]=1;
do
{
if(!map[i-1,j+2])
{
Push(S,i-1,j+2);
map[i-1][j+2]=1;
i=i-1;
j=j-2;
}
else if(!map[i-2,j+1])
{
Push(S,i-2,j+1);
map[i-2][j+1]=1;
i=i-2;
j=j+1;
}
else if(!map[i-2,j-1])
{
Push(S,i-2,j-1);
map[i-2][j-1]=1;
i=i-1;
j=j-1;
}
else if(!map[i-1,j-2])
{
Push(S,i-1,j-2);
map[i-1][j-2]=1;
i=i-1;
j=j-2;
}
else if(!map[i+1,j-2])
{
Push(S,i+1,j-2);
map[i+1][j-2]=1;
i=i+1;
j=j-1;
}
else if(!map[i+2,j-1])
{
Push(S,i+2,j-1);
map[i+2][j-1]=1;
i=i+1;
j=j-1;
}
else if(!map[i+2,j+1])
{
Push(S,i+2,j+1);
map[i+2][j+1]=1;
i=i+2;
j=j+1;
}
else if(!map[i+1,j+2])
{
Push(S,i+1,j+2);
map[i+1][j+2]=1;
i=i+1;
j=j+2;
}
else
{
Pop(S);
i=S->next->x;
j=S->next->y;
}
}while(num!=64);
}


void print(StackList S)
{
int x,y;
StackNode *temp=S->next;
while(temp)
{
printf("%d %d\n",temp->x,temp->y);
temp=temp->next;
}
}

int main()
{
StackList S;
int i,j;
int map[MAXSIZE][MAXSIZE]={{1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,0,0,0,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1}};
InitStack(S);
HorsePlay(S,map);
print(S);

return 0;
}

...全文
124 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ogiso_pest 2008-09-30
  • 打赏
  • 举报
回复
谢谢了
今天下午同学请吃饭
出去了
现在才回来看~
不好意思
aaajj 2008-09-30
  • 打赏
  • 举报
回复

可以参考
#include <iostream.h>
#include "seetime.h"

#define WIDE 5

struct Node {
int x;
int y;
int h;
Node* next;
};

struct Stack {
Node* base;
Node* top;
int length;
};

void InitStack(Stack &L)
{
L.base = L.top = NULL;
L.length = 0;
}

void Push(Stack &L, Node* p)
{
p->next = L.top;
L.top = p;
L.length++;
}

void Pop(Stack &L)
{
Node* p = L.top;
L.top = L.top->next;
delete p;
L.length--;
}

void ClearStack(Stack &L)
{
while (L.top != NULL)
{
Node* p = L.top;
L.top = L.top->next;
delete p;
}
}

int a[] = {2,1,-1,-2,-2,-1,1,2};
int b[] = {1,2,2,1,-1,-2,-2,-1};

int board[WIDE][WIDE] = {0};
int visit[WIDE][WIDE] = {0};

int main()
{
Settime();
int cx, cy, key = -1;
int start_x = 1;
int start_y = 1;
visit[start_x][start_y] = 1;
Stack L;
InitStack(L);
Node* p = new Node;
p->x = start_x;
p->y = start_y;
Push(L, p);
while (L.length < WIDE * WIDE )
{
for (int i = 0; i < 8; i++)
{
cx = L.top->x + a[i];
cy = L.top->y + b[i];
if (cx >= 0 && cx < WIDE && cy >= 0 && cy < WIDE )
{
if (visit[cx][cy] == 0 )
{
if (i <= key)
{
continue;
}
Node* q = new Node;
q->x = cx;
q->y = cy;
q->h = i;
Push(L, q);
key = -1;
visit[cx][cy] = 1;
break;
}
}
}

if (i == 8)
{
cx = L.top->x;
cy = L.top->y;
visit[cx][cy] = 0;
key = L.top->h;
Pop(L);
}

if (L.length == 0)
{
cout<<"no";
return 0;
}
}

Node* t = L.top;
for (int i = L.length; i > 0; i--)
{
board[t->x][t->y] = i;
t = t->next;
}

for ( i = 0; i < WIDE; i++)
{
for (int j = 0; j < WIDE; j++)
{
cout<<board[i][j]<<" ";
}
cout<<"\n\n\n";
}
ClearStack(L);
cout<<Gettime()<<endl;
return 1;
}

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧