且未

博客园 首页 新随笔 联系 订阅 管理

题目  中文题目,题意不在赘述,思路代码中。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

char mp[10][10];
int vis[10];
int cnt = 0;
int n,k;
/**
    采用的是按行递增的顺序来搜索的, 
    因此不可能出现同行的情况, 
    对于同列的情况,设置一个变量vis[],来保存列的访问状态,
    对于之前访问过的列, 棋子是不能再放在这一列上的.
*/
int dfs(int x,int y)//第x行,放第y颗棋子
{
    if(y>=k){
        cnt++;//记录这个方案可行
        return 0;
    }
    for(int i=x;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(mp[i][j]=='#'&&!vis[j])
            {
                vis[j]=1;
                dfs(i+1,y+1);//搜素下一行
                vis[j]=0;
            }
        }
    }
    return 0;
}
int main()
{
    while(cin>>n>>k)
    {
        if(n==-1&&k==-1) break;
        for(int i=0;i<n;i++)
            cin>>mp[i];
        memset(vis,0,sizeof(vis));
         cnt = 0;
        dfs(0,0);
        cout<<cnt<<endl;
    }
    return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char mp[10][10];
int vis[10];
int res = 0,n,k,cnt=0;
void dfs(int x)
{
    if(cnt==k){
        res++;
        return ;
    }
    if(x<0||x>=n) return ;
       for(int j=0;j<n;j++)
       {
           if(mp[x][j]=='#'&&vis[j]==0){
                cnt++;
                vis[j]=1;
                dfs(x+1);
                vis[j]=0;
                cnt--;
           }
       }
    dfs(x+1);
}
int main()
{
    while(cin>>n>>k)
    {
        if(n==-1&&k==-1) break;
        for(int i=0;i<n;i++)
            cin>>mp[i];
        dfs(0);
    cout<<res<<endl;
    memset(mp,0,sizeof(0));
        res = 0;
    }
    return 0;
}

 

posted on 2018-10-25 17:03  阿聊  阅读(107)  评论(0编辑  收藏  举报