骑士旅行问题

国际象棋的骑士遍历棋盘的所有格,利用试探性访问求得结果。小弟愚笨,整了接近一上午才搞定,过程中实在太多基础错误了,不过总算最后成功,得到能够走完的所有格的初始点及路线。附加程序如下

// 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;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值