poj 1321 棋盘问题(dfs)
棋盘问题
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 33559 | Accepted: 16616 |
Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
2 1
Java AC 代码
import java.util.Scanner; public class Main { static String chess[][];//棋盘 static boolean marked[];//因为行是递增(不一定是加1)往下存放棋子的,故只要存储列的状态就可以保证列和行都不重复 static int plans;//计划数 static int n, k;//棋盘大小和棋子数量 public static void main(String[] args) { Scanner sc = new Scanner(System.in); while((n = sc.nextInt()) != -1 && (k = sc.nextInt()) != -1) { plans = 0; chess = new String[n][n]; marked = new boolean[n]; for(int i = 0; i < n; i++) { String input = sc.next(); for(int j = 0; j < n; j++) { chess[i][j] = input.substring(j, j+1); } } for(int i = 0; i < n; i++) { //每行都可以作为第一行来放棋子,然后往下排 dfs(i, k); } System.out.println(plans); } } public static void dfs(int row, int leftNumber) { for(int i = 0; i < n; i++) { if(chess[row][i].equals("#") && !marked[i]) { if(leftNumber == 1) { //最后一个棋子找到了位置,则方案数加1 plans++; continue; //这里最开始写成了return,总是WA,后来DEBUG了半天才找到 } marked[i] = true; //这句话要放在上面的if下面,不然还要在if里面把标志位设置为false for(int j = row + 1; j < n; j++) { dfs(j , leftNumber - 1); } marked[i] = false; } } return; } }