源代碼:
#include<iostream>using?namespace?std?;
int?n,m,?ans?=?0?;
int?dx[8]?=?{-1,-2,-2,-1,1,2,2,1},?dy[8]?=?{-2,-1,1,2,-2,-1,1,2}?;
bool?visit[20][20]?;
bool?isvalid?(int?x,int?y)?{
return?x?<?n?&&?x?>=?0?&&?y?<?m?&&?y?>=?0?&&?!visit[x][y]?;
}
void?dfs(int?step,?int?x,int?y)?{
if?(step?==?n?*?m)?{
ans?++;?return?;
}
for?(int?d?=?0;?d?<?8;?d?++)?{
int?xx?=?x?+?dx[d],?yy?=?y?+?dy[d]?;
if?(isvalid(xx,yy))?{
visit[xx][yy]?=?1?;
dfs(step?+?1,xx,yy)?;
visit[xx][yy]?=?0?;
}
}
}
int?main()
{
int?T?;
cin?>>?T?;
while?(T?--)?{
memset(visit,0,sizeof(visit))?;
int?x,y?;
cin?>>?n?>>?m?>>?x?>>?y?;
ans?=?0;?visit[x][y]?=?1?;
dfs(1,x,y)?;
printf("%d\n",ans)?;
}
return?0?;
}
簡單的dfs壹下,dx和dy是方向數組,表示馬的8種走法,dfs時判斷每種走法是否在棋盤內且未被訪問過(isvalid函數,visit數組標記是否訪問過),當走過的步數等於m*n即棋盤大小時答案+1。望采納!