棋牌问题

版权声明:转载请注明出处即可 https://blog.csdn.net/qq_35170212/article/details/81750498

棋盘问题
Time Limit: 1000MS Memory Limit: 10000K
Description:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input:
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output:
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input:

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

Sample Output:
2
1
手撕:

#include<vector>
#include<iostream>
#include<string>
using namespace std;
static bool isok(vector<string>&vr,int i,int j){
    for(int k=0;k<vr.size();++k){
        if(k!=i&&vr[k][j]=='x')
            return false;
        if(k!=j&&vr[i][k]=='x')
            return false;
    }
    return true;
}
static void dfs(vector<string>&vr,int&cur,int k,int i,int j){
    if(k==0){
        cur++;
    }else{
        if(i<vr.size()&&j<vr[0].size()){
            if(vr[i][j]!='.'&&isok(vr,i,j)){
                vr[i][j]='x';
                if(j+1==vr.size())
                    dfs(vr,cur,k-1,i+1,0);
                else
                    dfs(vr,cur,k-1,i,j+1);
                vr[i][j]='#';
            }
            if(j+1==vr.size())
                dfs(vr,cur,k,i+1,0);
            else
                dfs(vr,cur,k,i,j+1);                
        }
    }
}

测试:

int main(){
    int n=0,m=0;
    vector<int>res;
    while(cin>>n>>m&&n!=-1&&m!=-1){
        vector<string>vr(n);
        for(int i=0;i<n;++i)
            cin>>vr[i];
        int cur=0;
        dfs(vr,cur,m,0,0);
        res.push_back(cur);
    }
    for(int i=0;i<res.size();++i){
        cout<<res[i]<<endl;
    }
    return 0;
}

来源:
http://poj.org/problem?id=1321

猜你喜欢

转载自blog.csdn.net/qq_35170212/article/details/81750498