马走日
题意:给定大小为n*m的棋盘,马从初始位置x,y移动,求马能够遍历棋盘的途径总数。如果不能则返回0
思路:马从一个点能够向8个方向移动,从点(x,y)进行搜索,每当遍历完成一遍棋盘(走的步数等于棋盘点的总数),计数器就加1。
#include<stdio.h>
#include<string.h>
#define N 11
int n,m,ans,nm,x,y;
int vis[N][N],dis[8][2]={1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
void dfs(int x,int y,int step)
{
if(step==nm)
{
ans++;
return;
}
for(int i=0;i<8;i++)
{
int nx=x+dis[i][0];
int ny=y+dis[i][1];
if(nx<0||nx>=n||ny<0||ny>=m||vis[nx][ny])
continue;
vis[nx][ny]=1;
dfs(nx,ny,step+1);
vis[nx][ny]=0;
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&n,&m,&x,&y);
memset(vis,0,sizeof(vis));
ans=0;
nm=n*m;
vis[x][y]=1;
dfs(x,y,1);
printf("%d\n",ans);
}
return 0;
}