POJ 1321 棋盘问题 (深度优先搜索)

该博客讨论了如何使用深度优先搜索算法解决一个棋盘问题,其中目标是在指定的棋盘上放置k个棋子,每行每列只能有一个棋子。博主详细解释了搜索策略,包括如何在搜索过程中添加额外参数以跟踪棋子位置,并提供了AC程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ 1321 棋盘问题 

题目大意:

给定一个n*n的矩阵表示一个棋盘,字符#表示可以放置棋子,字符.表示不可以放置棋子,请你求出在这个棋盘上放置k个棋子的摆放方式C。矩阵中不会有任何一行或任何一列只包含.,同时每一行、每一列只能有一个棋子。输入包含多组数据,每组数据的第一行含有两个整数,分别是n与k,接下来n行是一个n*n的矩阵,当n与k都等于-1时,输入数据结束。输出包含多行,每行含有一个整数C,表示对应数据的答案。

题目算法:

看到这样的题目,很容易就会想到一道经典的深搜题目八皇后。本题与八皇后相似,也是使用深度优先搜索,但与八皇后不同之处在于,八皇后每一行、每一列都一定会有一个棋子,但是本题不一样,例如如下矩阵摆放2个棋子时就不会每一行都有棋子:     ***#     **#*    *#**    #*** 。这种情况下,不是每一行、每一列都摆放了棋子,但从中我们也能找到搜索的规律。我们可以在深搜的函数中添加两个参数,分别为摆放第m个棋子与该棋子可以从第x行摆。每一次我们都可以从第x行枚举到第n行,同时每一行从第1个位置枚举到第n个位置,枚举到的位置为s[i][j],如若s[i][j]为#并且该列没有摆放棋子,则就将该棋子摆放在这个位置。如若这还不是第k个棋子,则继续深搜,执行函数dfs(m+1,x+1),如若是则cnt加1。我们并不需要判断第i行是否摆放棋子,因为我们下一次开始摆放的位置已经是下一行,不可能与之前棋子的摆放的行重复,因为将要摆放的这个棋子一定在之前的棋子下方了。在main函数中摆放第1个棋子,因该是执行函数dfs(1,1),因为第1个棋子可以在1~n行只见摆放。在搜索的过程中,注意还原状态。AC程序如下:

#include<iostream>
#include<cstring>
u

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值