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