首页 > 其他分享 >POJ1321 棋盘问题

POJ1321 棋盘问题

时间:2023-01-13 22:55:14浏览次数:48  
标签:int POJ1321 摆放 问题 棋子 MAXN 放不放 棋盘

POJ1321 棋盘问题

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放\(k\)个棋子的所有可行的摆放方案\(C\)。

输入含有多组测试数据。
每组数据的第一行是两个正整数,\(n\) \(k\),用一个空格隔开,表示了将在一个\(n \times n\)的矩阵内描述棋盘,以及摆放棋子的数目。 \(n \le 8 , k \le n\)
当为\(-1 -1\)时表示输入结束。
随后的\(n\)行描述了棋盘的形状:每行有\(n\)个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

对于每一组数据,给出一行输出,输出摆放的方案数目\(C\) (数据保证\(C<2^{31}\))。

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

2
1

这是一道简单的搜索题。

因为棋子是没有区别的,所以搜索不能搜每个棋子放在哪个位置,而是要搜每个位置要不要放棋子。

每次要放的时候标记一下行和列就可以了。

为什么呢?

举个例子,如果(1,1),(2,2),(3,3),(4,4)可以放棋子,要放4个。如果按照第一种搜索方法,第一次就会搜到:(1,1),(2,2),(3,3),(4,4),然后函数会回溯到第三层,然后第三个棋子又放在了(4,4),然后就搜到:(1,1),(2,2),(4,4)(3,3),就错了。而第二种方法会搜(1,1)放不放,(2,2)放不放,(3,3)放不放,(4,4)放不放,而搜到的全部的16种情况中,只有(1,1)放,(2,2)放,(3,3)放,(4,4)放这一种情况满足放4个的要求,这样就正确了。

代码

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10;
int n, k, ans;
char str[MAXN][MAXN];
bool lie[MAXN], hang[MAXN];
void dfs(int x, int y, int cnt) {
	if(cnt == k + 1){//放够了,返回 
		ans ++;
		return ;
	}
	if(x == n + 1)//搜出去了 
		return ;
		
	y + 1 <= n ? dfs(x, y + 1, cnt) : dfs(x + 1 ,1 ,cnt);//不放
	
	if (str[x][y] == '#' && ! hang[x] && ! lie[y]) {//放 
		hang[x] = lie[y] = 1;//标记
		y + 1 <= n ? dfs(x, y + 1, cnt + 1) : dfs(x + 1 ,1 ,cnt + 1);
		hang[x] = lie[y] = 0;//标记
	} 
}
int main() {
	while (scanf("%d%d", &n, &k) != EOF) {
		if (n == -1 && k == -1) 
			break;		
		for (int i = 1; i <= n; i ++)
			scanf("%s", str[i] + 1);
		ans = 0;
		
		dfs(1, 1, 1);
	
		printf("%d\n", ans);
	}
	return 0;
}

标签:int,POJ1321,摆放,问题,棋子,MAXN,放不放,棋盘
From: https://www.cnblogs.com/maniubi/p/17050931.html

相关文章

  • vue 使用echarts图表 setOption多次很卡问题解决
    项目场景:在开发ISM组态软件时,使用echarts图表,拖拽图表很卡。问题描述在vue中使用echarts使用setOption更新加载图形很慢原因分析:由于this.echartsView=echarts.init(view,......
  • clickhouse时间处理问题纳秒
    clickhouse写入时间后查询出来不对。差了上百年。场景:java中的long类型存入clickhouse中的long类型字段,作为时间。查询时,通过函数把long类型转化成时间格式。然后发现日......
  • Ubuntu Server20.04 sssd+samba4共享无法访问问题解决
    UbuntuServer20.04sssd+samba4共享无法访问问题解决报错: \\ipisnotaccessible排查:在samba的log里(/var/log/samba/log.ip)能看到winbinddnotrunning解决:#apt-getins......
  • cef浏览12306网站不正常问题
    cef版本:​​cef_binary_3.2623.1401.gb90a3be_windows32.7z​​使用cef时,浏览其它网站正常,唯独浏览器www.12306.cn时不正常,真是不可思议,cefclien......
  • 服务程序使用OutputDebugString,DbgView接收不到调试信息问题
    在服务程序中使用OutputDebugString输出调试信息后,发现DbgView接收不到调试信息,原来是我们少勾了一个选项。解决方法:菜单栏Capture-->CaptureGlobalWin32 勾上Ca......
  • 现代数据平台要实现自助用数,要解决的三个问题
    摘要:华为云FusionInsightMRSHetuEngine持续提升自助用数分析平台的可服务、易运维能力,基于AI技术持续提升对数据分析平台的智能化赋能水平,引领现代数据分析平台向专业化、......
  • 现代数据平台要实现自助用数,要解决的三个问题
    摘要:华为云FusionInsightMRSHetuEngine持续提升自助用数分析平台的可服务、易运维能力,基于AI技术持续提升对数据分析平台的智能化赋能水平,引领现代数据分析平台向专业化......
  • 题解 P8294 [省选联考 2022] 最大权独立集问题
    Solution根据一些逝去的记忆可以得到一个DP状态:\(f_{u,x,y}\)表示\(u\)这棵子树,\(x\)从子树出去,\(y\)进来这棵子树。然后讨论一下状态转移,可以暴力枚举状态,暴力枚......
  • 《浅谈保序回归问题》学习笔记
    1.偏序关系设$\preceq$是集合\(S\)上的一个二元关系,若\(R\)满足:自反性:\(\forallx\inS\),\(x\preceqx\);反对称性:\(\forallx,y\inS\),\(x\preceqy,y......
  • python虚拟环境迁移问题
    python虚拟环境迁移问题问题因目标机器网络限制,无法通过pip直接安装依赖包,但直接复制虚拟环境到另一台机器会,会导致无法执行python脚本文件本机python环境打包先......