主题:马之遍历问题,真是头疼,谁能帮一下,我会给高分的
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
typedef vector<vector<int> > Chess;
int num=1;
//八种跳法判断哪一种可行:不出界,不踏入已经来过的地方
bool can(int k,int i,int j,const Chess& chess){
switch(k){
case 0:i=i+1,j=j+2;break;
case 1:i=i-1,j=j+2;break;
case 2:i=i-2,j=j+1;break;
case 3:i=i-2,j=j-1;break;
case 4:i=i-1,j=j-2;break;
case 5:i=i+1,j=j-2;break;
case 6:i=i+2,j=j-1;break;
case 7:i=i+2,j=j+1;break;
}
return (i>-1&&i<8&&j>-1&&j<8&&chess[i][j]==0);//chess[il[j]==0,表示这个位置还没来过
}
//若八种跳法都不行,则return true
bool cannot(int i,int j,const Chess& chess){
for(int k=0;k<8;k++)
if(can(k,i,j,chess)) break;
return (k==8);
}
//跳一步
void go(Chess& chess,int& k,int& i,int&j){
switch(k){
case 0:i=i+1,j=j+2;break;
case 1:i=i-1,j=j+2;break;
case 2:i=i-2,j=j+1;break;
case 3:i=i-2,j=j-1;break;
case 4:i=i-1,j=j-2;break;
case 5:i=i+1,j=j-2;break;
case 6:i=i+2,j=j-1;break;
case 7:i=i+2,j=j+1;break;
}
chess[i][j]=++num;
}
//不成功则回退
void retreat(Chess& chess,int k,int& i,int& j){
chess[i][j]=0;
switch(k){
case 0:i=i-1,j=j-2;break;
case 1:i=i+1,j=j-2;break;
case 2:i=i+2,j=j-1;break;
case 3:i=i+2,j=j+1;break;
case 4:i=i+1,j=j+2;break;
case 5:i=i-1,j=j+2;break;
case 6:i=i-2,j=j+1;break;
case 7:i=i-2,j=j-1;break;
}
num--;
}
//如果棋盘所有地方都走过,则return true
bool complete(const Chess& chess){
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if (chess[i][j]==0)break;
return (i==8&&j==8);
}
bool run(Chess& chess,int& i,int& j, bool& done){
if(cannot(i,j,chess)){
if (complete(chess)) done=true;
else done=false;//如果再也不能走了,就检查一下棋盘是否走遍,如果不是则失败,反之成功
}
else {
for (int k=0;k<8;k++){
if(can(k,i,j,chess)) {
go(chess,k,i,j);
run(chess,i,j,done);
if(done==false){retreat(chess,k,i,j);continue;}
else break;
}
}
}
return done;
}
int main()
{
Chess chess(8,vector<int>(8,0));
int a,b;
bool done=true;
cout<<"please enter a and b:"<<endl;
cin>>a>>b;
a--;b--;
chess[a][b]=1;
run(chess,a,b,done);
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
cout<<setw(6)<<chess[i][j];
cout<<endl;
}
cout<<endl<<endl<<endl;
cin>>a;
return 0;
}
不知是我错了还是马本来就无法走全的
#include<vector>
#include<iomanip>
using namespace std;
typedef vector<vector<int> > Chess;
int num=1;
//八种跳法判断哪一种可行:不出界,不踏入已经来过的地方
bool can(int k,int i,int j,const Chess& chess){
switch(k){
case 0:i=i+1,j=j+2;break;
case 1:i=i-1,j=j+2;break;
case 2:i=i-2,j=j+1;break;
case 3:i=i-2,j=j-1;break;
case 4:i=i-1,j=j-2;break;
case 5:i=i+1,j=j-2;break;
case 6:i=i+2,j=j-1;break;
case 7:i=i+2,j=j+1;break;
}
return (i>-1&&i<8&&j>-1&&j<8&&chess[i][j]==0);//chess[il[j]==0,表示这个位置还没来过
}
//若八种跳法都不行,则return true
bool cannot(int i,int j,const Chess& chess){
for(int k=0;k<8;k++)
if(can(k,i,j,chess)) break;
return (k==8);
}
//跳一步
void go(Chess& chess,int& k,int& i,int&j){
switch(k){
case 0:i=i+1,j=j+2;break;
case 1:i=i-1,j=j+2;break;
case 2:i=i-2,j=j+1;break;
case 3:i=i-2,j=j-1;break;
case 4:i=i-1,j=j-2;break;
case 5:i=i+1,j=j-2;break;
case 6:i=i+2,j=j-1;break;
case 7:i=i+2,j=j+1;break;
}
chess[i][j]=++num;
}
//不成功则回退
void retreat(Chess& chess,int k,int& i,int& j){
chess[i][j]=0;
switch(k){
case 0:i=i-1,j=j-2;break;
case 1:i=i+1,j=j-2;break;
case 2:i=i+2,j=j-1;break;
case 3:i=i+2,j=j+1;break;
case 4:i=i+1,j=j+2;break;
case 5:i=i-1,j=j+2;break;
case 6:i=i-2,j=j+1;break;
case 7:i=i-2,j=j-1;break;
}
num--;
}
//如果棋盘所有地方都走过,则return true
bool complete(const Chess& chess){
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if (chess[i][j]==0)break;
return (i==8&&j==8);
}
bool run(Chess& chess,int& i,int& j, bool& done){
if(cannot(i,j,chess)){
if (complete(chess)) done=true;
else done=false;//如果再也不能走了,就检查一下棋盘是否走遍,如果不是则失败,反之成功
}
else {
for (int k=0;k<8;k++){
if(can(k,i,j,chess)) {
go(chess,k,i,j);
run(chess,i,j,done);
if(done==false){retreat(chess,k,i,j);continue;}
else break;
}
}
}
return done;
}
int main()
{
Chess chess(8,vector<int>(8,0));
int a,b;
bool done=true;
cout<<"please enter a and b:"<<endl;
cin>>a>>b;
a--;b--;
chess[a][b]=1;
run(chess,a,b,done);
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
cout<<setw(6)<<chess[i][j];
cout<<endl;
}
cout<<endl<<endl<<endl;
cin>>a;
return 0;
}
不知是我错了还是马本来就无法走全的