题意:给出两个数n,k,在一个n*n棋盘上有多少种可能每行每列上只有一颗棋子,要在这个棋盘上摆上k颗棋子一共有多少种可能
链接:http://poj.org/problem?id=1321
思路:回溯枚举,将所有的可能性全部找一遍,输出数量最多的一种
注意点:无
以下为AC代码:
Run ID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
13917522 | luminous11 | 1321 | Accepted | 752K | 141MS | G++ | 1497B | 2015-02-27 22:04:35 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
bool vis_ln[10] = { 0 };
bool vis_row[10] = { 0 };
string s[10];
int m, n;
int ans;
void dfs ( int ln, int cnt ){
if ( cnt == n ){ans ++;return;}
if ( ln > m )return;
for ( int i = 0; i < m; i ++ ){
if ( vis_ln[ln] == 0 && vis_row[i] == 0 && s[ln][i] == '#' ){
vis_ln[ln] = 1;
vis_row[i] = 1;
dfs ( ln + 1, cnt + 1 );
vis_ln[ln] = 0;
vis_row[i] = 0;
}
}
dfs ( ln+1, cnt );
}
int main()
{
ios::sync_with_stdio( false );
while ( cin >> m >> n ){
if ( m == -1 && n == -1 )return 0;
ans = 0;
for ( int i = 0; i < m; i ++ ){
s[i] = "";
cin.ignore();
cin >> s[i];
}
dfs ( 0, 0 );
cout << ans << endl;
}
return 0;
}