我碰见的不同的dfs写法,便于记忆:
🤦♀️>不知道为什么就TLE的写法!!!
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
int n,m;
const int N=11;
bool st[N][N];
int ans=0;
void dfs(int a,int b,int cnt)
{
if(a<0||b<0||a>=n||b>=m) return;
if(st[a][b]) return;
if(cnt==n*m)
{ ans++;
return;
}
st[a][b]=true;
for(int i=0;i<8;i++)
{
int nx=a+dx[i];
int ny=b+dy[i];
dfs(nx,ny,cnt+1);
}
st[a][b]=false;
}
int main()
{
int t;
cin>>t;
while(t--)
{ ans=0;
int sx,sy;
cin>>n>>m>>sx>>sy;
dfs(sx,sy,1);
cout<<ans<<endl;
}
return 0;
}
🤷♂️>不知道为什么改变判断条件就莫名其妙Ac的玄学写法
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
int n,m;
const int N=11;
bool st[N][N];
int ans=0;
void dfs(int a,int b,int cnt)
{
if(cnt==n*m)
{ ans++;
return;
}
st[a][b]=true;
for(int i=0;i<8;i++)
{
int nx=a+dx[i];
int ny=b+dy[i];
if(nx<0||ny<0||nx>=n||ny>=m) continue;
if(st[nx][ny])continue;
dfs(nx,ny,cnt+1);
}
st[a][b]=false;
}
int main()
{
int t;
cin>>t;
while(t--)
{ ans=0;
int sx,sy;
cin>>n>>m>>sx>>sy;
dfs(sx,sy,1);
cout<<ans<<endl;
}
return 0;
}
最后这种写法才是我这种弱鸡才会准确写对的一种写法,回溯与标记在一起,美滋滋😊😊
#include<bits/stdc++.h>
using namespace std;
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={1,2,2,1,-1,-2,-2,-1};
int n,m;
const int N=11;
bool st[N][N];
int ans=0;
void dfs(int a,int b,int cnt)
{
if(cnt==n*m)
{ ans++;
return;
}
st[a][b]=true;
for(int i=0;i<8;i++)
{
int nx=a+dx[i];
int ny=b+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&!st[nx][ny])
{
st[nx][ny]=true;
dfs(nx,ny,cnt+1);
st[nx][ny]=false;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{ ans=0;
int sx,sy;
cin>>n>>m>>sx>>sy;
memset(st,0,sizeof(st));
st[sx][sy]=1;
dfs(sx,sy,1);
cout<<ans<<endl;
}
return 0;
}
第一种T飞了。。。
你知道为什么吗,难道这就是玄学吗
…
因为没有判断条件呀
是因为会爆栈貌似