棋盘问题 dp-动态规划
Time limit:1000 ms Memory limit:10000 kB Source: 蔡错@pku http://poj.org/searchproblem?field=source&key=%E8%94%A1%E9%94%99%40pku描述
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
输入
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
输出
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Input
2 1
#.
.#
4 4
…#
…#.
.#…
#…
-1 -1
Output
2
1
代码
#include <iostream>
#include <algorithm>
#include <string>
#define _for(i, a) for(int i=0; i < (a); i++)
#define _rep(i, a, b) for(int i = (a); i < (b); i++)
#define max_n 9
#define ll long long
using namespace std;
int n = 0, k = 0;
string a[max_n];
bool r[max_n], c[max_n];//r是行,c是列
//x,y是坐标,,w是还要放的棋子数目,,p是方案数目
int dfs(int x, int y, int w, int p) {
if (w == 0) return 1;
if (x == n) { x = 0; y++; }
if (y == n) return 0;
while ((a[y][x] == '.' || r[x] || c[y])) {
x++;
if (x == n) {
x = 0; y++;
}
if (y == n) return 0;
}
r[x] = 1; c[y] = 1;
p += dfs(x + 1, y, w - 1, 0);
r[x] = 0; c[y] = 0;
p += dfs(x + 1, y, w, 0);
return p;
}
int main() {
ios::sync_with_stdio(false);
//freopen("input.txt", "r", stdin);
while (cin >> n >> k, n != -1 || k != -1) {
_for(i, n) { cin >> a[i]; }
cout << dfs(0, 0, k, 0) << '\n';
}
return 0;
}
本人也是新手,也是在学习中,勿喷
转载请注明出处
欢迎有问题的小伙伴一起交流哦~