DFS_棋盘问题

虽然这是DFS的简单应用,虽然刚学了DFS,但是当遇到题目时,还是云里雾里,递归写法还是不怎么熟练……

递归嘛,在我看来,关键在控制好递归函数的参数,递归出口,标记变量,回溯时清除标记


#include<bits/stdc++.h>
using namespace std;
char G[15][15];
int vis[8];
int ans,n,k;
void dfs(int a,int b)
{
    if(b==k) ans++;
    else if(a>n) return;
    else
    {
        for(int i=a+1;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(G[i][j]=='#'&&!vis[j])
                {
                    vis[j]=1;
                    G[i][j]='.';
                    dfs(i,b+1);
                    vis[j]=0;
                    G[i][j]='#';
                }
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&k)==2&&(n!=-1||k!=-1))
    {
        for(int i=0;i<n;i++) scanf("%s",G[i]);
        memset(vis,0,sizeof(vis));
        ans=0;
        dfs(-1,0);
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80551547
今日推荐