思路:典型的dfs问题。注意回溯以及x和y的方向问题!(输入几行几列时,cin可以省去相对于scanf要去除回车的步骤)
#include <iostream>
#include <string.h>
using namespace std;
int vis[100][100];
int dis[8][2] = {1,2,2,1,-1,2,-2,1,-1,-2,-2,-1,1,-2,2,-1};
int m,n,sx,sy,sum,ans;
void dfs(int x,int y,int cnt)
{
if(cnt>=sum)
{
ans++;
return;
}
for(int i=0;i<8;i++)
{
int tx=x+dis[i][0];
int ty=y+dis[i][1];
if(tx>=0 && ty>=0 && tx<n && ty <m && !vis[tx][ty])
{
vis[tx][ty]=1;
dfs(tx,ty,cnt+1);
vis[tx][ty]=0;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
cin>>n>>m>>sx>>sy;
sum=m*n;
ans=0;
vis[sx][sy]=1;
dfs(sx,sy,1);
cout<<ans<<endl;
}
return 0;
}