国际象棋的骑士遍历棋盘的所有格,利用试探性访问求得结果。小弟愚笨,整了接近一上午才搞定,过程中实在太多基础错误了,不过总算最后成功,得到能够走完的所有格的初始点及路线。附加程序如下
// new24.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include<cstdlib>
#include <ctime>
using namespace std;
int nextStep(int[][8],int&, int& ,int);
int* paixu(int[],int[],int);
void print(int[][8]);
int _tmain(int argc, _TCHAR* argv[])
{const int bb=8;
int currentRow=2;
int currentColumn=3;
for(int mn=0;mn<8;mn++)
{
for(int cu=0;cu<8;cu++)
{
currentColumn=mn;
currentRow=cu;
int board[bb][bb]={0};
board[currentRow][currentColumn]=1;
int i;
for( i=1;i<64;i++)
{int m;
m=nextStep(board,currentRow,currentColumn,i);
if(m==0) {cout<<"骑士行走了"<<i<<"步"<<endl;
break;}
}
if(i==64)
{cout<<"骑士行走了"<<i<<"步"<<endl;
print(board);
cout<<"\n初始位置是["<<cu<<","<<mn<<"]"<<endl;
}
}
}
return 0;
}
int nextStep(int m[][8],int& a,int& b,int i)
{
int jieguo[8]={9,9,9,9,9,9,9,9}, mm=0, shuzi[8]={9,9,9,9,9,9,9,9};
int horizontal[8]={2,1,-1,-2,-2,-1,1,2};
int vertical[8]={-1,-2,-2,-1,1,2,2,1};
int judge[8][8]={{2,3,4,4,4,4,3,2},{3,4,6,6,6,6,4,3},{4,6,8,8,8,8,6,4},
{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{3,4,6,6,6,6,4,3},{2,3,4,4,4,4,3,2}};
for(int j=0;j<8;j++)
{
a+=vertical[j];
b+=horizontal[j];
if(a>7||a<0)
{ a-=vertical[j];
b-=horizontal[j];
continue;
}
if(b>7||b<0)
{ a-=vertical[j];
b-=horizontal[j];
continue;
}
if(m[a][b]!=0)
{a-=vertical[j];
b-=horizontal[j];
continue;
}
jieguo[mm]=judge[a][b];
shuzi[mm]=j;
mm++;
a-=vertical[j];
b-=horizontal[j];
}
if(mm==0) return 0;
//int * haha;
paixu( shuzi,jieguo,mm);
a+=vertical[shuzi[0]];
b+=horizontal[shuzi[0]];
m[a][b]=i+1;
return 1;
}
int* paixu(int n1[8],int n[8],int mm)
{
//int* m;
int x;
for(int i=0;i<mm-1;i++)
{
for(int j=0;j<mm-i-1;j++)
{
if(n[j]>n[j+1])
{x=n[j];
n[j]=n[j+1];
n[j+1]=x;
x=n1[j];
n1[j]=n1[j+1];
n1[j+1]=x;
}
}
}
return n;
}
void print(int c[][8])
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
}