日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

069.騎士巡游

 C語(yǔ)言與CPP編程 2022-05-01 發(fā)布于安徽
//
/*                       騎士巡游問(wèn)題                                   */
/

#include <stdio.h>
int f[11][11] ;                                /*定義一個(gè)矩陣來(lái)模擬棋盤*/
int adjm[121][121];/*標(biāo)志矩陣,即對(duì)于上述棋盤,依次進(jìn)行編號(hào)
		    1--121(行優(yōu)先)可以從一個(gè)棋盤格i跳到棋盤格j時(shí),adjm[i][j]=1*/

void creatadjm(void);                            /*創(chuàng)建標(biāo)志矩陣函數(shù)聲明*/
void mark(int,int,int,int);                     /*將標(biāo)志矩陣相應(yīng)位置置1*/
void travel(int,int);                                    /*巡游函數(shù)聲明*/
int n,m;                                 /*定義矩陣大小及標(biāo)志矩陣的大小*/


/******************************主函數(shù)***********************************/
int main()
{
    int i,j,k,l;
    printf("Please input size of the chessboard: ");  /*輸入矩陣的大小值*/
	scanf("%d",&n);
    m=n*n;
    creatadjm();                                         /*創(chuàng)建標(biāo)志矩陣*/
	puts("The sign matrix is:");
    for(i=1;i<=m;i++)                                /*打印輸出標(biāo)志矩陣*/
    {
        for(j=1;j<=m;j++) 
			printf("%2d",adjm[i][j]);
        printf("\n");
    }
    
    printf("Please input the knight's position (i,j): "); /*輸入騎士的初始位置*/
    scanf("%d %d",&i,&j);
    l=(i-1)*n+j;                   /*騎士當(dāng)前位置對(duì)應(yīng)的標(biāo)志矩陣的橫坐標(biāo)*/
    while ((i>0)||(j>0))                             /*對(duì)騎士位置的判斷*/
    {
        for(i=1;i<=n;i++)                              /*棋盤矩陣初始化*/
            for(j=1;j<=n;j++)
                f[i][j]=0;
        k=0;                                             /*所跳步數(shù)計(jì)數(shù)*/
        travel(l,k);                                /*從i,j出發(fā)開(kāi)始巡游*/
        puts("The travel steps are:");
        for(i=1;i<=n;i++)                      /*巡游完成后輸出巡游過(guò)程*/
		{
            for(j=1;j<=n;j++) 
			    printf("%4d",f[i][j]);
            printf("\n");
		}
        
        printf("Please input the knight's position (i,j): ");/*為再次巡游輸入起始位置*/
	    scanf("%d %d",&i,&j);
        l=(i-1)*n+j;
    }
	puts("\n Press any key to quit... ");
	getch();
    return 0;
}



/*****************************創(chuàng)建標(biāo)志矩陣子函數(shù)*************************/
void creatadjm()
{
    int i,j;
    for(i=1;i<=n;i++)                                   /*巡游矩陣初始化*/
        for(j=1;j<=n;j++)
            f[i][j]=0;
    for(i=1;i<=m;i++)                                   /*標(biāo)志矩陣初始化*/
        for(j=1;j<=m;j++)
            adjm[i][j]=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(f[i][j]==0)           /*對(duì)所有符合條件的標(biāo)志矩陣種元素置1*/
			{
                f[i][j]=1;
                if((i+2<=n)&&(j+1<=n)) mark(i,j,i+2,j+1);
                if((i+2<=n)&&(j-1>=1)) mark(i,j,i+2,j-1);
                if((i-2>=1)&&(j+1<=n)) mark(i,j,i-2,j+1);
                if((i-2>=1)&&(j-1>=1)) mark(i,j,i-2,j-1);
                if((j+2<=n)&&(i+1<=n)) mark(i,j,i+1,j+2);
                if((j+2<=n)&&(i-1>=1)) mark(i,j,i-1,j+2);
                if((j-2>=1)&&(i+1<=n)) mark(i,j,i+1,j-2);
                if((j-2>=1)&&(i-1>=1)) mark(i,j,i-1,j-2);
			} 
    return;
}


/*********************************巡游子函數(shù)*******************************/
void travel(int p,int r)
{
    int i,j,q;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(f[i][j]>r) f[i][j]=0;              /*棋盤矩陣的置〉r時(shí),置0*/
    r=r+1;                                                   /*跳步計(jì)數(shù)加1*/
    i=((p-1)/n)+1;                                  /*還原棋盤矩陣的橫坐標(biāo)*/
    j=((p-1)%n)+1;                                  /*還原棋盤矩陣的縱坐標(biāo)*/
    f[i][j]=r;                              /*將f[i][j]做為第r跳步的目的地*/
   


    for(q=1;q<=m;q++)           /*從所有可能的情況出發(fā),開(kāi)始進(jìn)行試探式巡游*/
	{
        i=((q-1)/n)+1;
        j=((q-1)%n)+1;
        if((adjm[p][q]==1)&&(f[i][j]==0)) 
			travel(q,r);                                    /*遞歸調(diào)用自身*/
    }
    return;
}

/*************************賦值子函數(shù)***************************************/
void mark(int i1,int j1,int i2,int j2)
{
    adjm[(i1-1)*n+j1][(i2-1)*n+j2]=1;
    adjm[(i2-1)*n+j2][(i1-1)*n+j1]=1;
    return;
}

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多