zoj1002(Fire Net)

来源:互联网 发布:建军大业知乎 编辑:程序博客网 时间:2024/06/05 09:04

题目描述:

        给定一个二维的字符数组,'X' 表示当前位置是wall, '.' 表示当前位置可以放置blockhouse。求最多能在给定的图形中放置多少各blockhouse。(要求blockhouse之间不能在同一行或同一列,有wall在中间除外)


解题思路:

       由于给定的字符数组最大是4*4的,可以采用枚举的方法。

import java.util.Scanner;public class Main {static boolean deal( int x, int y, int n, int number) {int th = x * n + y;int ans = number & (1 << th);return ans > 0 ? true : false;}static boolean isLegal(int number, char [][] a, int n) {for(int i=0;i<n;i++) {for(int j=0;j<n;j++) {if(deal(i,j,n,number) == false)   //当前位置没有放置housecontinue;if(a[i][j] == 'X') return false;for(int k=j+1;k<n;k++) {if(a[i][k] == 'X') break;if(deal(i,k,n,number)) return false;}for(int k=i+1;k<n;k++) {if(a[k][j] == 'X')break;if(deal(k,j,n,number)) return false;}}}return true;}public static void main(String[] args) {char [][] a;a = new char [4][4];int n;Scanner read = new Scanner(System.in);while(read.hasNext()) {n = read.nextInt();if(n == 0)break;String s;for(int i=0;i<n;i++) {s = read.next();for(int j=0;j<n;j++) {a[i][j] = s.charAt(j);}}int ans = 0;for(int i=1;i<(1<<n*n);i++) {if(isLegal(i,a,n)) {int cnt = 0, num = i;while(num>0) {cnt++;num &= num-1;}if(cnt > ans)ans = cnt;}}System.out.println(ans);}read.close();}}


0 0