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个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 

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;
    }
}

 

 
posted @ 2016-05-26 20:35  kk_kk  阅读(185)  评论(0编辑  收藏  举报