骑士巡游问题

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//骑士巡游问题

#include <stdio.h>

int f[11][11] ;

int adjm[121][121];

long fgf;

void creatadjm(void);

void e(int,int,int,int);

void travel(int,int);

int n,m;

int main()

{

int i,j,k,l;

printf("Input n:");scanf("%d",&n);

m=n*n;

creatadjm();

for(i=1;i<=m;i++)

{

for(j=1;j<=m;j++) printf("%2d",adjm[i][j]);

printf("\n");

}

getchar();

printf("Input i,j:");

scanf("%d %d",&i,&j);

l=(i-1)*n+j;

while ((i>0)||(j>0))

{

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

f[i][j]=0;

k=0;

travel(l,k);

printf("%d\n",fgf);fgf=0;

for(i=1;i<=n;i++)

{

for(j=1;j<=n;j++) printf("%4d",f[i][j]);

printf("\n");

}

getchar();

printf("Input i,j:");scanf("%d %d",&i,&j);

l=(i-1)*n+j;

}

return 0;

}

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++)

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)

{

f[i][j]=1;

if((i+2<=n)&&(j+1<=n)) e(i,j,i+2,j+1);

if((i+2<=n)&&(j-1>=1)) e(i,j,i+2,j-1);

if((i-2>=1)&&(j+1<=n)) e(i,j,i-2,j+1);

if((i-2>=1)&&(j-1>=1)) e(i,j,i-2,j-1);

if((j+2<=n)&&(i+1<=n)) e(i,j,i+1,j+2);

if((j+2<=n)&&(i-1>=1)) e(i,j,i-1,j+2);

if((j-2>=1)&&(i+1<=n)) e(i,j,i+1,j-2);

if((j-2>=1)&&(i-1>=1)) e(i,j,i-1,j-2);

}

return;

}

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=r+1;

i=((p-1)/n)+1;

j=((p-1)%n)+1;

f[i][j]=r;

fgf++;

//if(r==25)printf("%d\n",p);

/*

printf("i=%d,j=%d,r=%d\n",i,j,r); getchar();

*/

for(q=1;q<=m;q++)

{

i=((q-1)/n)+1;

j=((q-1)%n)+1;

if((adjm[p][q]==1)&&(f[i][j]==0)) travel(q,r);

}

return;

}

void e(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;

}

--------------------------------------------------------------------------------

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航