一道深搜的题,个人认为不难,但是就是不对,也检查不出代码问题。代码如下:
#include<bits/stdc++.h>
using namespace std;
int again[10][10];
int shu;
int ans=0;
int n,m,x,y;
int a[8]={-2,-1,1,2,-2,-1,1,2};
int b[8]={1,2,2,1,-1,-2,-2,-1};
void dfs(int h,int z,int c)
{
if(c==n*m)
{
ans++;
return;
}
for(int i=0;i<8;i++)
{
if(h+a[i]>0&&h+a[i]<n&&z+b[i]>0&&z+b[i]<m&&again[h+a[i]][z+b[i]]==0)
{
again[h+a[i]][z+b[i]]=1;
dfs(h+a[i],z+b[i],c+1);
again[h+a[i]][z+b[i]]=0;
}
}
}
int main()
{
cin>>shu;
for(int i=0;i<shu;i++)
{
cin>>n>>m>>x>>y;
for(int j=0;j<n;j++)
{
for(int z=0;z<m;z++)
{
again[j][z]=0;
}
}
again[x][y]=1;
dfs(x,y,1);
cout<<ans<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int again[10][10];
int n,m,x,y;
int ans=0;
int a[8]={-2,-1,1,2,-2,-1,1,2};
int b[8]={1,2,2,1,-1,-2,-2,-1};
void dfs(int h,int z,int c)
{
if(c==n*m)
{
ans++;
return;
}
for(int i=0;i<8;i++)
{
//这里 大于等于号。注意下。
if( h+a[i]>=0 && h+a[i]<n && z+b[i]>=0 && z+b[i]<m && again[h+a[i]][z+b[i]]==0)
{
again[h+a[i]][z+b[i]]=1;
dfs(h+a[i],z+b[i],c+1);
again[h+a[i]][z+b[i]]=0;
}
}
}
int main()
{
int shu;
cin>>shu;
for(int i=0;i<shu;i++)
{
cin>>n>>m>>x>>y;
for(int j=0;j<n;j++)
{
for(int z=0;z<m;z++)
{
again[j][z]=0;
}
}
ans=0; //这里要初始化一下
again[x][y]=1;
dfs(x,y,1);
cout<<ans<<endl;
}
return 0;
}