设计一个国际象棋的马踏遍棋盘的演示程序。
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"windows.h"
#define N 12
int top=0; //栈顶指针用于记录步数
int col[]= {2,1,-1,-2,-2,-1,1,2};
int row[]= {-1,-2,-2,-1,1,2,2,1};
struct stack
{
int x;
int y;
int step;
} ma[N*N+1]= {{0,0,0}};
void push(int a[][N],int i,int j,int m) //进栈
{
ma[top].x=i;
ma[top].y=j;
ma[top].step=m;
a[i][j]=++top;
}
int pop(int a[][N]) //出栈
{
int temp;
top--;
a[ma[top].x][ma[top].y]=0;
ma[top].x=0;
ma[top].y=0;
temp=ma[top].step+1; //转为下一个方向
ma[top].step=0;
return temp;
}
int judge(int i,int j,int a[][N]) //判断是否可跳
{
if(i>=0&&j>=0&&i<N&&j<N&&a[i][j]==0)
return 1;
return 0;
}
int jump(int i,int j,int a[][N])
{
int t,ti=i,tj=j,count=0;
for(t=0; t<8; t++)
{
ti+=row[t];
tj+=col[t];
if(judge(ti,tj,a))
count++; //计算第二次有多少可跳的方向
ti-=row[t];
tj-=col[t];
}
return count;
}
int sort(int a[8]) //参数a数组表示选择每个方向后有多少跳法
{
int i,min=a[0],t=0;
for(i=1; i<8; i++)
{
if(min>a[i]&&a[i]>-1&&a[i]<8)
{
min=a[i]; //找出可跳方向最少的路径
t=i;
}
}
return t;
}
void disp(int a[][N])
{
int t,i,j,count=0,b[N][N]= {0};
for(t=0; t<N*N; t++)
{
system("cls");
printf("显示跳马过程...\n");
count++;
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
if(a[i][j]==count)
{
b[i][j]=count;
break;
}
}
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
printf("%4d",b[i][j]);
printf("\n");
}
Sleep(500);
}
system("cls");
printf("最终结果为:\n");
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
printf("%4d",b[i][j]);
printf("\n");
}
}
void horse(int x,int y)
{
int i=x,j=y,min,ti,tj,t,temp=0,flag=0,temp1=0;
int count[8],num[8]= {0};
int a[N][N]= {{0}};
for(x=0; x<8; x++)
count[x]=8;
push(a,i,j,0);
while(top<N*N)
{
ti=i;
tj=j;
temp1=0;
flag=0; //flag表示能否继续跳跃
for(x=0; x<8; x++)
count[x]=8;
for(t=temp; t<8; t++,temp1++) //计算第一次有多少可跳的方向
{
ti+=row[t];
tj+=col[t];
if(judge(ti,tj,a))
{
count[temp1]=jump(ti,tj,a); //count数组表示第一次选择的跳跃方向进行第二次跳跃时有多少方向
flag=1;
}
ti-=row[t];
tj-=col[t];
}
if(flag)
{
min=sort(count); //选择路径最少的方向先跳
ti+=row[min];
tj+=col[min];
push(a,ti,tj,min);
i=ti;
j=tj;
temp=0;
}
else
{
temp=pop(a); //当不能继续跳跃时,出栈回到上一次跳跃位置
i=ma[top-1].x;
j=ma[top-1].y;
}
}
printf("\n\n");
disp(a);
}
main()
{
int x,y;
char c;
printf(" ********欢迎使用跳马程序********\n");
while(1)
{
system("cls");
printf(" ************欢迎使用跳马程序************\n");
printf(" * 1.玩法说明 *\n");
printf(" * 2.开始游戏 *\n");
printf(" * 3.退出游戏 *\n");
printf(" ****************************************\n");
printf(" 请输入功能选项(1..3): ");
c=getchar();
system("cls");
switch(c)
{
case '1':
printf("给定9×9的棋盘格,输入马的任意初始位置,马按“日”字形跳,开始游戏后将显示马跳通所有格子的路径,格子中的数字代表马在第几次跳跃时跳到该格子\n");
break;
case '2':
do
{
printf("请输入马初始位置的x坐标:");
scanf("%d",&x);
printf("请输入马初始位置的y坐标:");
scanf("%d",&y);
if(x>N||y>N||x<1||y<1)
printf("错误!请重新输入,X(1~%d),Y(1~%d)\n",N,N);
}while(x>N||y>N||x<1||y<1);
system("pause");
system("cls");
horse(x-1,y-1);
break;
case '3':
exit(1);
break;
default:
printf("输入有误\n");
}
system("pause");
getchar();
}
return 0;
}
package 蓝桥;
//import java.util.Scanner;
public class 马踏棋盘 {
public static int [][]board=new int[8][8];
public static int index=1;
public static int x=4;
public static int y=7;
public static void main(String[] args) {
board[x][y]=1;
hours();
}
public static void hours() {
if(index==64)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
System.out.printf("%2d",board[i][j]);
System.out.print(" ");
}
System.out.println();
}
System.exit(0);
}
else{
int []b=sort();
for(int i=0;i<8;i++)
{
index++;
jumpto(b[i]);
hours();
index--;
jumpback(b[i]);
}
}
}
public static int jump(int way) {
switch (way) {
case 0:
if(x-2>=0&&y+1<8&&board[x-2][y+1]==0)
{
return 1;
}
break;
case 1:
if(x-1>=0&&y+2<8&&board[x-1][y+2]==0)
{
return 1;
}
break;
case 2:
if(x+1<8&&y+2<8&&board[x+1][y+2]==0)
{
return 1;
}
break;
case 3:
if(x+2<8&&y+1<8&&board[x+2][y+1]==0)
{
return 1;
}
break;
case 4:
if(x+2<8&&y-1>=0&&board[x+2][y-1]==0)
{
return 1;
}
break;
case 5:
if(x+1<8&&y-2>=0&&board[x+1][y-2]==0)
{
return 1;
}
break;
case 6:
if(x-1>=0&&y-2>=0&&board[x-1][y-2]==0)
{
return 1;
}
break;
case 7:
if(x-2>=0&&y-1>=0&&board[x-2][y-1]==0)
{
return 1;
}
break;
default:
break;
}
return 0;
}
public static int jump(int xi,int yi,int way) {
switch (way) {
case 0:
if(xi-2>=0&&yi+1<8&&board[xi-2][yi+1]==0)
{
return 1;
}
break;
case 1:
if(xi-1>=0&&yi+2<8&&board[xi-1][yi+2]==0)
{
return 1;
}
break;
case 2:
if(xi+1<8&&yi+2<8&&board[xi+1][yi+2]==0)
{
return 1;
}
break;
case 3:
if(xi+2<8&&yi+1<8&&board[xi+2][yi+1]==0)
{
return 1;
}
break;
case 4:
if(xi+2<8&&yi-1>=0&&board[xi+2][yi-1]==0)
{
return 1;
}
break;
case 5:
if(xi+1<8&&yi-2>=0&&board[xi+1][yi-2]==0)
{
return 1;
}
break;
case 6:
if(xi-1>=0&&yi-2>=0&&board[xi-1][yi-2]==0)
{
return 1;
}
break;
case 7:
if(xi-2>=0&&yi-1>=0&&board[xi-2][yi-1]==0)
{
return 1;
}
break;
default:
break;
}
return 0;
}
public static void jumpto( int way) {
switch (way) {
case 0:
{
x=x-2;y=y+1;
board[x][y]=index;
}
break;
case 1:
{
x=x-1;y=y+2;
board[x][y]=index;
}
break;
case 2:
{
x=x+1;y=y+2;
board[x][y]=index;
}
break;
case 3:
{
x=x+2;y=y+1;
board[x][y]=index;
}
break;
case 4:
{
x=x+2;y=y-1;
board[x][y]=index;
}
break;
case 5:
{
x=x+1;y=y-2;
board[x][y]=index;
}
break;
case 6:
{
x=x-1;y=y-2;
board[x][y]=index;
}
break;
case 7:
{
x=x-2;y=y-1;
board[x][y]=index;
}
break;
default:
break;
}
}
public static void jumpback(int way) {
switch (way) {
case 0:
{board[x][y]=0;
x=x+2;y=y-1;
}
break;
case 1:
{
board[x][y]=0;
x=x+1;y=y-2;
}
break;
case 2:
{board[x][y]=0;
x=x-1;y=y-2;
}
break;
case 3:
{board[x][y]=0;
x=x-2;y=y-1;
}
break;
case 4:
{board[x][y]=0;
x=x-2;y=y+1;
}
break;
case 5:
{ board[x][y]=0;
x=x-1;y=y+2;
}
break;
case 6:
{board[x][y]=0;
x=x+1;y=y+2;
}
break;
case 7:
{board[x][y]=0;
x=x+2;y=y+1;
}
break;
default:
break;
}
}
public static int [] jumpto(int xi,int yi, int way) {
switch (way) {
case 0:
{
xi=xi-2;yi=yi+1;
}
break;
case 1:
{
xi=xi-1;yi=yi+2;
}
break;
case 2:
{
xi=xi+1;yi=yi+2;
}
break;
case 3:
{
xi=xi+2;yi=yi+1;
}
break;
case 4:
{
xi=xi+2;yi=yi-1;
}
break;
case 5:
{
xi=xi+1;yi=yi-2;
}
break;
case 6:
{
xi=xi-1;yi=yi-2;
}
break;
case 7:
{
xi=xi-2;yi=yi-1;
}
break;
default:
break;
}
int []a=new int [2];
a[0]=xi;a[1]=yi;
return a;
}
public static int num(int way) {
int sum=0;
int xi=x;
int yi=y;
int []a=jumpto(xi, yi, way);
for(int i=0;i<8;i++)
{
if(jump(a[0], a[1], i)==1)
sum++;
}
return sum;
}
public static int [] sort() {
int []a=new int [8];
for(int i=0;i<8;i++)
{
if(jump(i)==0)
{
a[i]=100;
}
else{
a[i]=num(i);
}
}
int loc=0;
int []b=new int [8];
for(int m=0;m<8;m++)
{
int min=100;
for(int i=0;i<8;i++)
{
if(a[i]<min)
{
min=a[i];
loc=i;
}
}
b[m]=loc;
a[loc]=10;
}
return b;
}
}