简单马踏棋盘设计(C++)

从某点出发不重复地遍历完成整个棋盘输出遍历点的先后:

这就利用dfs暴搜,提前找两步

本质上是贪心算法,

不用递归。

答案个数非常多:

输入参数:起点坐标+你想要的解的个数:

下面祭出代码:

就以9*10的象棋棋盘为例:

#include<stdio.h>
 
#include<string.h>
 
#include<stdlib.h>
 
#define row 9
 
#define col 10
 
bool chess[row][col];//棋盘
 
int choose[2][8]={{1,2,1,-2,-1,2,-1,-2},{2,1,-2,1,2,-1,-2,-1}};//方向选择
 
typedef struct{
 
int s[row*col][11];
 
int top;
 
}mystack;
 
inline bool valid(int x,int y,int info){//对于给定的x,y,info是否符合要求
 
int delta_x=choose[0][info];
int delta_y=choose[1][info];
 
if(x+delta_x<0||x+delta_x>=row||y+delta_y<0||y+delta_y>=col||chess[x+delta_x][y+delta_y]==true) return false;
 
else return true;
 
}
 
void getpath(mystack &ch,int hx,int hy,int maxsize)
 
{int number=0;
 
int loop=1;
 
    hx--;hy--;
 
    memset(chess,false,sizeof(chess));
 
    chess[hx][hy]=true;
 
    int rank[2][8];//存放依照出路个数排的:路径号;出路个数;
 
    ch.top=1;
 
    ch.s[0][8]=hx;ch.s[0][9]=hy;ch.s[0][10]=-1;
 
    int top,x,y,num,cmd,t;
 
    while(ch.top!=0){loop++;
 
     if(ch.top==row*col-1){//发现一个解
        printf("第%d次循环第%d个解:\n",loop++,1+number++);
        int help=0;//换行器
        int y;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
               for( y=0;y<row*col;y++){
                if(ch.s[y][8]==i&&ch.s[y][9]==j){
                    printf("%d \t",y+1);help++;break;
                }
               }
               if(y==row*col){
                printf("%d\t",90);help++;
               }
               if(help%10==0){printf("\n");}
            }
        }
     }
       top=ch.top-1;num=0;
       if(ch.s[top][10]==-1){//开始分配方向(依照出路个数)
            ch.s[top][10]=0;
        x=ch.s[top][8];y=ch.s[top][9];
        for(int i=0;i<8;i++){
            if(valid(x,y,i)){chess[x+choose[0][i]][y+choose[1][i]]=true;cmd=0;//假设,最后还要//还原
                for(int j=0;j<8;j++){
                    if(valid(x+choose[0][i],y+choose[1][i],j)){cmd++;}
                }
                if(cmd){
                    rank[0][num]=i;rank[1][num++]=cmd;
                }
                chess[x+choose[0][i]][y+choose[1][i]]=false;
            }
            //printf("%d\n",num);
        }
           if(number==maxsize) return;
        if(num){
            for(int i=0;i<num-1;i++){//先简单选择排序
                for(int j=i+1;j<num;j++){
                    if(rank[1][j]>rank[1][i]){
                        t=rank[1][j];rank[1][j]=rank[1][i];rank[1][i]=t;
                        t=rank[0][j];rank[0][j]=rank[0][i];rank[0][i]=t;
                    }
                }
            }
            ch.s[top][10]=num;
            for(int i=0;i<num;i++){
               //printf("%d ",rank[1][i]);
                ch.s[top][i]=rank[0][i];
            }
//printf("\n");
            x=ch.s[top][8];y=ch.s[top][9];num=ch.s[top][10];
            num=ch.s[top][num-1];ch.s[top][10]--;
            top=ch.top-1;
        ch.s[top+1][8]=x+choose[0][num];ch.s[top+1][9]=y+choose[1][num];ch.s[top+1][10]=-1;
        chess[x+choose[0][num]][y+choose[1][num]]=true;
        ch.top++;
        }
       }
      else {
        x=ch.s[top][8];y=ch.s[top][9];num=ch.s[top][10];//printf("%d %d ",top,num);
        if(num){//printf("%d %d\n",num,top);
        num=ch.s[top][num-1];ch.s[top][10]--;
        ch.s[top+1][8]=x+choose[0][num];ch.s[top+1][9]=y+choose[1][num];ch.s[top+1][10]=-1;
        chess[x+choose[0][num]][y+choose[1][num]]=true;
             //printf("%d %d\n",x+choose[0][num],y+choose[1][num]);
        ch.top++;
      }
      }
      if(top!=ch.top-2&&ch.s[top][10]==0){
            x=ch.s[top][8];y=ch.s[top][9];chess[x][y]=false;//退格
        ch.top--;//没有可行解
top--;
       }
    }
}
int main()
{
mystack s;
int hx,hy,maxsize;
printf("请输入起点,最大解个数\n");scanf("%d%d%d",&hx,&hy,&maxsize);
getpath(s,hx,hy,maxsize);
}

运行效果:

请输入起点,最大解个数
3 4 5
第90次循环第1个解:
42      39      2       35      50      17      14      21      32      19
3       36      41      46      15      34      51      18      13      22
40      43      38      1       68      49      16      33      20      31
37      4       45      70      47      58      67      52      23      12
44      79      74      81      72      69      48      59      30      53
5       86      71      84      75      82      57      66      11      24
78      89      80      73      62      65      60      27      54      29
87      6       85      76      83      8       63      56      25      10
90      77      88      7       64      61      26      9       28      55
第99次循环第2个解:
42      39      2       35      50      17      14      21      32      19
3       36      41      46      15      34      51      18      13      22
40      43      38      1       68      49      16      33      20      31
37      4       45      70      47      58      67      52      23      12
44      79      74      81      72      69      48      59      30      53
5       90      71      84      75      82      57      66      11      24
78      87      80      73      62      65      60      27      54      29
89      6       85      76      83      8       63      56      25      10
86      77      88      7       64      61      26      9       28      55
第110次循环第3个解:
42      39      2       35      50      17      14      21      32      19
3       36      41      46      15      34      51      18      13      22
40      43      38      1       68      49      16      33      20      31
37      4       45      70      47      58      67      52      23      12
44      79      74      81      72      69      48      59      30      53
5       88      71      84      75      82      57      66      11      24
78      85      80      73      62      65      60      27      54      29
89      6       87      76      83      8       63      56      25      10
86      77      90      7       64      61      26      9       28      55
第119次循环第4个解:
42      39      2       35      50      17      14      21      32      19
3       36      41      46      15      34      51      18      13      22
40      43      38      1       68      49      16      33      20      31
37      4       45      70      47      58      67      52      23      12
44      79      74      81      72      69      48      59      30      53
5       88      71      84      75      82      57      66      11      24
78      85      80      73      62      65      60      27      54      29
87      6       89      76      83      8       63      56      25      10
90      77      86      7       64      61      26      9       28      55
第132次循环第5个解:
42      39      2       35      50      17      14      21      32      19
3       36      41      46      15      34      51      18      13      22
40      43      38      1       68      49      16      33      20      31
37      4       45      70      47      58      67      52      23      12
44      79      74      81      72      69      48      59      30      53
5       86      71      88      75      82      57      66      11      24
78      89      80      73      62      65      60      27      54      29
85      6       87      76      83      8       63      56      25      10
90      77      84      7       64      61      26      9       28      55

Process returned 0 (0x0)   execution time : 4.406 s
Press any key to continue.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值