poj 1321二次元図は同列ではない.

1802 ワード

http://poj.org/problem?id=1321
ボードの問題
Time Limit: 1000 MS
 
メモリLimit: 100000 K
Total Submissions: 29074
 
Acceepted: 14410
Description
与えられた形状のボード(形が不規則かもしれない)に駒を並べます.駒には違いがありません.任意の2つの駒を碁盤の中の同じ行または同じ列に置くことはできません.所与の形と大きさの碁盤について、k個の駒を配置するすべての実行可能な配置案Cをプログラミングして解いてください.
Input
複数のグループのテストデータを入力します. 
各グループのデータの最初の行は2つの正の整数で、n kは、1つの空白で区切られて、1つの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 <iostream>
#include <string.h>
using namespace std;
char str;
bool f[9][9],g[9];/// g[]      
int ans,k,n;
void  sovle(int l,int num)
{
    if(num==k)
    {
        ans++;
        return;
    }
    if(l>=n)
        return;
    for(int i=0; i<n; i++)
    {
        if(f[l][i]&&!g[i])
        {
            g[i]=true;        ///        ,g[i]   true
            sovle(l+1,num+1); ///     ,   ,    
            g[i]=false;       ///     ,g[i]  false,
        }

    }
    sovle(l+1,num);
    return ;
}
int main()
{

    while(cin>>n>>k)
    {
        if(n==-1&&k==-1)
            break;
        memset(f,false,sizeof(f));
        memset(g,false,sizeof(g));

        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
            {
                cin>>str;
                if(str=='#')
                    f[i][j]=true;
            }
        ans=0;
        sovle(0,0);
        cout<<ans<<endl;
    }

    return 0;
}