首页 > C/C++语言 > C/C++数据结构 > C语言解决骑士巡游问题
2012
06-01

C语言解决骑士巡游问题

例如:
    
骑士巡游问题概括如下:在国际象棋一个攀爬上一块一匹马,然后用在国际象棋的“马字”股是要求马不能重复完成的25个格子。枚举法解决骑士巡游问题的实例。程序可定制的董事会,第一个输出符号矩阵的大小,然后进入棋盘上的初始位置,它可以提供一个解决方案的骑士。
实例分析:
    
这个实例首先使用基本的输入和输出语句需要用户输入的电路板尺寸(小于或等于11),然后调用子程序creatadjm()创建符号矩阵和矩阵打印输出的初始位置片(I,J),调用巡航功能的旅行()开始游行;最后,棋盘矩阵输出。
邮编:
" xf="#包括 " wf="# Include ">#包括
INT F [11] [11]; / *定义一个矩阵来模拟板* /
INT adjm [121] [121]; / *标志矩阵,即董事会,由数
      
1 – 121(第一行),可以跳棋盘棋盘J,I,adjm [I] [J] = 1 * /
creatadjm无效(无效); / *创建矩阵符号函数声明* /
无效标志(INT,INT,INT,INT); / *设置相应的标志位置在矩阵1 * /
无效的旅行(INT,INT); / *函数声明*游行/
INT N,M / *定义矩阵的大小和符号矩阵的大小* /

/******************************主要功能***************** ******************/
主要INT()
{
    
INT I,J,K,L;
    
printf的(“请输入棋盘的大小:”); / *输入矩阵值的大小* /
 
scanf函数(“%D”,&N);
    
M = N * N;
    
creatadjm(); / *创建的标志矩阵* /
 
(“符号矩阵是:”);
    
(I = 1; I <= M,我+)/ *打印输出符号矩阵* /
    
{
        
(J = 1; J <= M,J + +中)
   
输出(“%2D”,adjm [I] [J]);
        
printf的(“\ N”);
    
}
   
    
printf(“请输入骑士的位置(I,J ):"); / *输入骑士的初始位置* /
    
scanf函数(“%d月%d”,&I&J);
    
L =(I – 1)* N + J; / *骑士横坐标相应的符​​号矩阵的当前位置* /
    
 0) | | (j> 0)) / * * to determine the location of the knight /" xf="((I> 0)| |(J> 0))/ *确定位置的骑士/     " wf="while ((i> 0) | | (j> 0)) / * * to determine the location of the knight /">((I> 0)| |(J> 0))/ *确定位置的骑士/
    
{
        
(I = 1; I <= N;我+ +)/ *初始化板矩阵* /
            
(J = 1,J <= N,J + +中)
                
F [I] [J] = 0;
        
K = 0; / *计数的跳数* /
        
旅游(L,K); / * I,J之旅开始开始* /
        
(“旅行的步骤是:”);
        
(I = 1;我<= N;我+)/ *输出游行后,游行过程中* /
  
{
            
(J = 1,J <= N,J + +中)
       
输出(“%4D”,F [I] [J]);
            
printf的(“\ N”);
  
}
       
        
printf(“请输入骑士的位置(I,J):");/*重新进入游行的起始位置* /
     
scanf函数(“%d月%d”,&I&J);
        
L =(I – 1)* N + J;
    
}
 
将(“\ n按任何键退出…");
 
getch();
    
返回0;
}
 
/*****************************创建迹象矩阵函数*************** * *********/
无效creatadjm()
{
    
INT I,J;
    
(= 1 <= N;我+)/ *初始化游行矩阵* /
        
(J = 1,J <= N,J + +中)
            
F [I] [J] = 0;
    
(= 1 <= M;我+)/ *初始化矩阵符号* /
        
(J = 1; J <= M,J + +中)
            
adjm [I] [J] = 0;
    
(I = 1; I <= N; I + +)
        
(J = 1,J <= N,J + +中)
            
如果(f [I] [J] == 0)/ *标志设置为1,为所有合资格的矩阵元素* /
   
{
                
F [I] [J] = 1;
                
IF((我2 <= N)&&(J +1 <= N))标志(I,J,我2,J +1);
                
 = 1)) mark (i, j, i +2, j-1);" xf="IF((我2 = 1))标志(I,J,I 2,J – 1);                 " wf="if ((i +2 = 1)) mark (i, j, i +2, j-1);">IF((我2 <= N)&&(J – 1> = 1))标志(I,J,I 2,J – 1);
                
 = 1) & & (j +1 = 1)&&(J +1 = 1) & & (j +1 ((I – 2> = 1)&&(J +1 <= N))标志(I,J,I – 2,J +1);
                
 = 1) & & (j-1> = 1)) mark (i, j, i-2, j-1);" xf="((I – 2> = 1)&&(J – 1> = 1))标志(I,J,I – 2,J – 1);                 " wf="if ((i-2> = 1) & & (j-1> = 1)) mark (i, j, i-2, j-1);">((I – 2> = 1)&&(J – 1> = 1))标志(I,J,I – 2,J – 1);
                
((J +2 <= N)&&(I +1 <= N))标志(I,J,I +1,J +2);
                
 = 1)) mark (i, j, i-1, j +2);" xf="((J +2 = 1))标志(I,J,I – 1,J 2);                 " wf="if ((j +2 = 1)) mark (i, j, i-1, j +2);">((J +2 <= N)&&(I – 1> = 1))标志(I,J,I – 1,J 2);
                
 = 1) & & (i +1 = 1)&&(I +1 = 1) & & (i +1 IF((J – 2> = 1)&&(I +1 <= N))标志(I,J,I +1,J – 2);
                
 = 1) & & (i-1> = 1)) mark (i, j, i-1, j-2);" xf="IF((J – 2> = 1)&&(I – 1> = 1))标志(I,J,I – 1,J – 2);    " wf="if ((j-2> = 1) & & (i-1> = 1)) mark (i, j, i-1, j-2);">IF((J – 2> = 1)&&(I – 1> = 1))标志(I,J,I – 1,J – 2);
   
}
    
回报;
}

/*********************************巡游功能************* * *****************/
无效的旅行(P,INT ř)
{
    
INT I,J,Q;
    
(I = 1; I <= N; I + +)
        
(J = 1,J <= N,J + +中)
            
 r) f [i] [j] = 0; / * set the matrix board> r, the set 0 * /" xf="(F [我] [J]> R)F [I] [J] = 0; / *设置矩阵板> R,设置为0 * /     " wf="if (f [i] [j]> r) f [i] [j] = 0; / * set the matrix board> r, the set 0 * /">(F [我] [J]> R)F [I] [J] = 0; / *设置矩阵板> R,设置为0 * /
    
R = R +1 / *跳计数加1 * /
    
我=((P – 1)/ N)1 / *恢复横坐标棋盘矩阵* /
    
J =((P – 1)%N)+1; / *恢复矩阵板纵坐标* /
    
F [I] [J] = R / *的F [I] [J]作为第一步目标跳R * /
  

    (Q = 1; Q <= M,Q + +)/ *从所有可能的情况下,他们开始测试风格游行* /
 
{
        
I =((Q – 1)/ N)+1;
        
J =((Q – 1)%N)+1;
        
IF((adjm [P] [Q] == 1)&&(F [I] [J] == 0))
   
旅游(Q,R)/ *递归调用本身* /
    
}
    
回报;
}
/*************************分配功能********* * *****************/
无效标志(INT I1,J1,I2,INT J2)
{
    
adjm [(I1 - 1)* N + J1] [(I2 - 1)* N + J2] = 1;
    
adjm [(I2 - 1)* N + J2] [(I1 - 1)* N + J1] = 1;
    
回报;
}


留下一个回复