值得一做的经典搜索题目:POJ1321棋盘问题

POJ 1312 棋盘问题

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

类似N皇后,但是与N皇后最大的区别是,N皇后需要每行都有一个棋子,而这道题只要棋子数到达K即可,不一定每行都要有棋子。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static char[][] map;
	static int n,k,ans;
	static boolean[] vis;
	public static void main(String[] args) throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String[] s;
		while(true) {
			s=br.readLine().split(" ");
			n=Integer.valueOf(s[0]);k=Integer.valueOf(s[1]);ans=0;
			if(n==-1&&k==-1)return;
			map=new char[n][n];
			vis=new boolean[n];
			for(int i=0;i<n;i++) {
				map[i]=br.readLine().toCharArray();
			}
			dfs(0,0);
			System.out.println(ans);
		}
	}
	public static void dfs(int num,int index) {
		if(num==k) {
			ans++;
			return;
		}
		if(index==n)return;
		for(int i=0;i<n;i++) {
				if(map[index][i]=='#'&&!vis[i]) {
					vis[i]=true;
					dfs(num+1,index+1);
					vis[i]=false;
				}
		}
		dfs(num,index+1);
	}
}

你可能感兴趣的:(kuangbin专题)