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

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

这就利用dfs暴搜,只不过是提前找两步罢了,根本用不上什么启发式算法(贪心算法)等等,

而且根本不用递归。

答案个数非常多:

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

下面祭出代码:

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

#include

#include

#include

#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

            for(int j=0;j

               for( y=0;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

                for(int j=i+1;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

               //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.

你可能感兴趣的:(数据结构(ds),数据结构,c++)