马踏棋盘问题

/*问题描述:N*N的棋盘,从棋盘中的某个格开始,是否存在经过棋盘上所有格一次且仅一次的通路!

*/ 

//回溯方式

  1. #include<iostream>
  2. using namespace std;
  3. #define N 8 //N*N的棋盘
  4. int Roads[N*N];//存储走的方式
  5. int count=0;//存储共有几种走的方式
  6. bool visited[N+2][N+2];//加边界,便于处理,记录访问过的格
  7. int main(){
  8.  void Init();//初始化
  9.  void Hoof(int steps,int x,int y);
  10.  Init();
  11.  int Start_x,Start_y;
  12.     cout<<"输入起始位置(x,y)(1<=x<=8,1<=y<=8)!"<<endl;
  13.  cin>>Start_x>>Start_y;
  14.  Roads[0]=0;//起始点
  15.  visited[Start_x][Start_y]=true;
  16.  Hoof(1,Start_x,Start_y);
  17.  if(count==0)cout<<"不存在通过所有格一次且仅一次的途径!"<<endl;
  18.  return 0;
  19. }
  20. void Init(){
  21.  for(int i=0;i<N+2;i++){/*边界初始化*/
  22.   visited[0][i]=true;
  23.   visited[N+1][i]=true;
  24.   visited[i][0]=true;
  25.   visited[i][N+1]=true;
  26.  }
  27.  for(i=1;i<=N;i++){/*棋格初始化*/
  28.   for(int j=1;j<=N;j++)visited[i][j]=false;
  29.  }
  30. }
  31. void Hoof(int steps,int x,int y){
  32.  if(steps==N*N){/* 输出此次结果*/
  33.   cout<<"第"<<count+1<<"种方式为:"<<endl;
  34.   for(int i=1;i<=N*N;i++){
  35.    switch(Roads[i]){
  36.    case 1:cout<<"上";break;
  37.    case 2:cout<<"下";break;
  38.    case 3:cout<<"左";break;
  39.    case 4:cout<<"右";break;
  40.    }
  41.   }
  42.   count++;
  43.   cout<<endl;
  44.   return ;
  45.  }
  46.  else{
  47.   bool temp=false;//判断是否四路都不通
  48.   for(int i=1;i<=4;i++){/*1~4分表代表上,下,左,右的前进方向*/
  49.    switch(i){
  50.    case 1:/*往上*/
  51.     if(!visited[x-1][y]){
  52.      Roads[steps]=1;
  53.      visited[x-1][y]=true;
  54.      temp=true;
  55.      Hoof(steps+1,x-1,y);
  56.      visited[x-1][y]=false;
  57.       }break;
  58.    case 2:/*往下*/
  59.     if(!visited[x+1][y]){
  60.      Roads[steps]=2;
  61.      visited[x+1][y]=true;
  62.      temp=true;
  63.      Hoof(steps+1,x+1,y);
  64.      visited[x+1][y]=false;
  65.       }break;
  66.    case 3:/*往左*/
  67.     if(!visited[x][y-1]){
  68.      Roads[steps]=3;
  69.      visited[x][y-1]=true;
  70.      temp=true;
  71.      Hoof(steps+1,x,y-1);
  72.      visited[x][y-1]=false;
  73.       }break;
  74.    case 4:/*往右*/
  75.     if(!visited[x][y+1]){
  76.      Roads[steps]=4;
  77.      visited[x][y+1]=true;
  78.      temp=true;
  79.      Hoof(steps+1,x,y+1);
  80.      visited[x][y+1]=false;
  81.       }break;
  82.    }
  83.   }//end_for
  84.   if(!temp)return;//四个方向都不通,回走一步
  85.  }
  86. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值