暴力dfs搜索,注意return的位置,如果枚举完四种放法不return的话那么就会空出一行
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int ans;
bool fg;
int n;
int vis[11][11];
bool check(int x,int y)
{
if(!vis[x][y]&&x>=1&&x<=n&&y>=1&&y<=4) return true;
return false;
}
void dfs(int k)
{
if(k==4*n&&fg){ans++;return;}
if(k>=4*n){return;}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=4;j++)
{
if(check(i,j)&&check(i,j+1)&&check(i+1,j)&&check(i+1,j+1)&&!fg)
{
fg=1;
vis[i][j]=vis[i+1][j]=vis[i][j+1]=vis[i+1][j+1]=1;
dfs(k+4);
fg=0;
vis[i][j]=vis[i+1][j]=vis[i][j+1]=vis[i+1][j+1]=0;
}
if(check(i,j)&&check(i,j+1))
{
vis[i][j]=vis[i][j+1]=1;
dfs(k+2);
vis[i][j]=vis[i][j+1]=0;
}
if(check(i,j)&&check(i+1,j))
{
vis[i][j]=vis[i+1][j]=1;
dfs(k+2);
vis[i][j]=vis[i+1][j]=0;
}
if(check(i,j))
{
vis[i][j]=1;
dfs(k+1);
vis[i][j]=0;
return;
}
}
}
}
int main()
{
int T;cin>>T;
while(T--)
{
cin>>n;
ans=0;
fg=0;
memset(vis,0,sizeof(vis));
dfs(0);
printf("%d\n",ans);
}
return 0;
}
本文深入探讨了暴力深度优先搜索(DFS)算法的应用,通过一个具体案例,详细讲解了如何利用DFS进行有效的状态搜索,避免重复计算,以及如何正确设置返回条件防止无效搜索。文章还特别强调了在枚举所有可能的放法后正确使用return的重要性,以避免出现空行的问题。
260

被折叠的 条评论
为什么被折叠?



