莫欺少年穷,修魔之旅在这开始—>算法提高课题解
保姆级注释,看不懂你炸我
思路:
1. ans 存储遍历棋盘的次数,cnt 存储当前搜到了第几个点
2. 记录该点,枚举该点的八个方向,对符合条件的点做 dfs,最后不要忘了恢复现场呦!
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n,m,x,y;
bool st[N][N];
int ans;
//日子格的八个方向
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
void dfs(int x,int y,int cnt)
{
//已遍历完整个棋盘
if(cnt==n*m)
{
ans++;
return;
}
//记录该点
st[x][y]=true;
//枚举八个方向
for(int i=0;i<8;i++)
{
int a=x+dx[i],b=y+dy[i];
//超出边界
if(a<0||a>=n||b<0||b>=m) continue;
//该点已被记录过
if(st[a][b]) continue;
//dfs符合条件的该点
dfs(a,b,cnt+1);
}
//恢复现场
st[x][y]=false;
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m>>x>>y;
//多组测试数据,ans要归零
ans=0;
dfs(x,y,1);
cout<<ans<<endl;
}
return 0;
}