// 这是使用应用程序向导生成的 VC++
// 应用程序项目的主项目文件。
#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
#include<string.h>
#include<ctype.h>
#include<malloc.h>
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<io.h>
#include<math.h>
#include<process.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 1000
#define STACK_INCREMENT 20
typedef int Status;
typedef struct
{int x; /* 行值 */
int y; /* 列值 */
}PosType;
PosType start;
typedef struct
{PosType seat;
int di;
}SElemType;
typedef struct SqStack
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
int curstep=1;
int chess[12][12];
void InitStack(SqStack *S)
{ /* 构造一个空栈S */
(*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base;
(*S).stacksize=STACK_INIT_SIZE;
}
Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
void Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
{
(*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!(*S).base)
exit(OVERFLOW); /* 存储分配失败 */
(*S).top=(*S).base+(*S).stacksize;
(*S).stacksize+=STACK_INCREMENT;
}
*((*S).top)++=e;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if((*S).top==(*S).base)
return ERROR;
*e=*--(*S).top;
return OK;
}
void Print()
{ int i,j;
for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
printf("%6d",chess[i][j]);
printf("\n");
}printf("\n");
}
void Init(int k)
{int i,j;
for(i=0;i<12;i++)
{chess[0][i]=-1;chess[1][i]=-1; chess[11][i]=-1;chess[10][i]=-1;}
for(i=0;i<12;i++)
{chess[i][0]=-1;chess[i][1]=-1; chess[i][11]=-1;chess[i][10]=-1;}
for(i=2;i<10;i++)
for(j=2;j<10;j++)
chess[i][j]=k;
printf("棋盘结构如下:\n");
Print();
}
void MarkPrint(PosType b)
{
chess[b.x][b.y]=0;
}
Status text()
{ int i,j;
for(i=2;i<10;i++)
{
for(j=2;j<10;j++)
if(chess[i][j]==0) return ERROR;
}
return TRUE;
}
Status Pass(PosType b)
{ if(chess[b.x][b.y]==0)
return OK;
else
return ERROR;
}
void FootPrint(PosType a)
{
chess[a.x][a.y]=curstep;
}
void NextPos(PosType *c,int di)
{
PosType direc[8]={{2,1},{1,2},{2,-1},{1,-2},{-2,-1},{-1,-2},{-2,1},{-1,2}};
(*c).x+=direc[di].x;
(*c).y+=direc[di].y;
}
Status chessPath(PosType start)
{ SqStack S;
PosType curpos; int z;
SElemType e;
InitStack(&S);
curpos=start;
do
{
if(Pass(curpos))
{ FootPrint(curpos);
e.seat=curpos;
e.di=0;
Push(&S,e);
curstep++;Print();scanf("%d",&z);
if(text()) return TRUE;
NextPos(&curpos,e.di);
}
else
{ if(!StackEmpty(S))
{
curstep--; Pop(&S,&e);
while(e.di==7&&!StackEmpty(S))
{if(chess[curpos.x][curpos.y]) MarkPrint(e.seat);
Pop(&S,&e);curstep--;
}
if(e.di<7)
{
e.di++;
Push(&S,e);
curpos=e.seat; curstep++;
NextPos(&curpos,e.di);
}
}
}
}while(!StackEmpty(S));
return FALSE;
}
void main()
{
Init(0);
int i,j;
for(i=2;i<11;i++)
{
for(j=2;j<12;j++)
{ start.x=i;start.y=j;if(chessPath(start)){printf ("answer is\n");Print();}}
}
}
真希望哪个高手给我改改
谢谢了