棋盘问题 dp-动态规划

版权声明:原创文章转载时请注明出处 https://blog.csdn.net/weixin_42856843/article/details/88878442

棋盘问题 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;
}

本人也是新手,也是在学习中,勿喷

转载请注明出处

欢迎有问题的小伙伴一起交流哦~

猜你喜欢

转载自blog.csdn.net/weixin_42856843/article/details/88878442
今日推荐