ACM題目————棋盤問題


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

由於數據很小,直接DFS便好!

//Asimple
#include <iostream>
#include <string.h>

using namespace std;

int n, T, num, cnt, p;
char Map[10][10];
int vis[10];//記錄同一列是否有過棋子

using namespace std;

void DFS(int k)
{
    if( num == p )
    {
        cnt ++ ;
        return ;
    }
    if( k >= n ) return ;//邊界
    for( int i=0; i<n; i++)
    {
        if(!vis[i] && Map[k][i]=='#')
        {
            vis[i] = 1 ;
            num ++ ;
            DFS(k+1);
            num -- ;
            vis[i] = 0 ;
        }
    }
    DFS(k+1);
}

int main()
{
    while( cin >> n >> p )
    {
        if( n == -1 && p == -1 ) break ;
        for (int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                cin >> Map[i][j] ;
        memset(vis,0,sizeof(vis));
        cnt = 0 ;
        num = 0 ;
        DFS(0);
        cout << cnt << endl ;

    }

    return 0;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM