马踏棋盘问题

2024-07-18 12:12:19作者:饭克斯

#include

usingnamespacestd;

structinfo{intx,y,out;};

constintdx[8]={-2,-2,-1,-1,1,1,2,2};

constintdy[8]={-1,1,-2,2,-2,2,-1,1};

constintR=8,C=8;

intboard[R][C];

intoutlet(intx,inty)

{

intct=0;

for(inti=0;i<8;++i)

if(x+dx[i]=R||y+dy[i]>=C||board[x+dx[i]][y+dy[i]])continue;

else++ct;

returnct;

}//计算(x,y)的出口数

voidsort(info*p,intn)

{

for(inti=n-1;i>0;--i)

if(p[i].out<p[i-1].out)swap(p[i],p[i-1]);

elsebreak;

}//按出口数由小到大排序

boolsearch(intx,inty,intstep)

{

if(board[x][y])returnfalse;

if(step==R*C)

{

board[x][y]=step;

returntrue;

}

else

{

board[x][y]=step;

inti,j;infodir[8];

for(i=j=0;i<8;++i)

if(x+dx[i]=R||y+dy[i]>=C||board[x+dx[i]][y+dy[i]])continue;

else

{

dir[j].x=x+dx[i];dir[j].y=y+dy[i];

dir[j].out=outlet(dir[j].x,dir[j].y);

sort(dir,++j);

}

for(i=0;i<j;++i)

if(search(dir[i].x,dir[i].y,step+1))returntrue;

board[x][y]=0;

returnfalse;

}

}//求解

intmain()

{

inti,j,m,n;

for(i=0;i<R;++i)

for(j=0;j<C;++j)

{

memset(board,0,R*C*sizeof(int));

if(search(i,j,1))

{

printf(startat(%d,%d):\n,i+1,j+1);

for(m=0;m<R;++m)

{

for(n=0;n<C;++n)

printf(%4d,board[m][n]);

printf(\n\n);

}

}

else

printf(startat(%d,%d)hasnosolve!\n,i+1,j+1);

}

system(pause);

return0;

}

展开全文

热门推荐

相关攻略

猜你喜欢