棋盘问题 DFS+回溯

来源:互联网 发布:沃伦夫妇纪录片 知乎 编辑:程序博客网 时间:2024/05/22 13:57

/*DFS+回溯。*/#include <stdio.h>#include <cstring>int n,k,ans;char map[9][9];bool vis[100];bool x[9],y[9];void dfs(int sum,int col){    if(sum>=k)    {        ans++;        return ;    }    if(col>n) return ;    for(int i=0;i<n;i++)    {        if(map[i][col]=='#'&&!x[i]&&!y[col])        {            x[i]=true;            y[col]=true;            dfs(sum+1,col+1);//符合条件的,传入sum+1进行深搜。            x[i]=false;//回溯的过程中注意将标记进行还原。            y[col]=false;        }    }    dfs(sum,col+1);//不符合条件的,传入sum进行深搜。}int main(){    while(scanf("%d%d",&n,&k)==2)    {        if(n==-1&&k==-1) break;        char op[9];        for(int i=0;i<n;i++)        {            scanf("%s",op);            for(int j=0;j<n;j++)            map[i][j]=op[j];        }        memset(x,false,sizeof(x));        memset(y,false,sizeof(y));        memset(vis,false,sizeof(vis));        ans=0;        dfs(0,0);        printf("%d\n",ans);    }    return 0;}


原创粉丝点击