骑士问题

来源:互联网 发布:崩坏学园2淘宝 编辑:程序博客网 时间:2024/06/10 06:30

大一时候写的骑士问题,今天翻出来加了点注释.

主要的思想是:每次跳的地方是不容易到达的地方,这样更能接近解。


#include<iostream>#include<stdlib.h>#include<iomanip>using namespace std;static int a[8][8]={0};static int str[8][8]={8};static int x,y,i(0),k;static int row[8]={-1,-2,-2,-1,1,2,2,1};static int column[8]={2,1,-1,-2,-2,-1,1,2};void valuable();void print();void move(int);bool able(int,int);void go();void move(){ i++;a[x][y]=i;}int main(){    cout<<"please enter x(0-7): ";    cin>>x;    cout<<"please enter y(0-7): ";cin>>y;    while(i<64){  go();  valuable();      move();  }  print();    system("pause");  return 0;}//valuable 计算i,j坐标下可以走的步数 void  valuable(){int i,j;       for(i=0;i<=7;i++)for(j=0;j<=7;j++){ int q=0;int m,n;   for(int k=0;k<=7;k++){m=i+row[k];n=j+column[k];if(able(m,n))q++;   }str[i][j]=q;}}//bool able(int,int)bool able(int x,int y){if(x>=0&&x<8&&y>=0&&y<8&&a[x][y]==0)return true;return false;}//void print()void print(){    cout<<endl;int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++)cout<<setw(4)<<a[i][j];    cout<<endl;}}//go()void go(){     int b[8]; //b数组用来计数  表示往哪个方向跳,哪个方向可以走的步数      int o,p,k,m,n,t;     //初始为0      for(o=0;o<=7;o++)      b[o]=0;         for(k=0;k<=7;k++)  {  m=x+row[k];  n=y+column[k];  if(able(m,n))  b[k]=str[m][n];  }    //b数组排序,按升序排列   for(o=0;o<7;o++)      for(p=0;p<7;p++)  if(b[p]>b[p+1]){  t=b[p+1];  b[p+1]=b[p];  b[p]=t;  } //找到一个b中不为0的数 ,选一个最小的数,先走不好到达的地方。    int s;   for(k=0;k<=7;k++)   if(b[k]!=0){    s=b[k];   break;}//然后赋值下一步      for(k=0;k<=7;k++){   m=x+row[k];            n=y+column[k];      if(able(m,n)&&s==str[m][n]){  x=m;  y=n;          break;   }} }