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
- zoj1002(Fire Net)
- ZOJ1002 Fire Net(非递归版)
- ZOJ1002 Fire Net(递归版)
- zoj1002 FIRE NET(搜索算法DFS)
- 杭电1045(zoj1002)Fire Net
- ZOJ1002-Fire Net(深度优先搜索)
- zoj1002 Fire Net
- ZOJ1002 Fire Net
- fire net(zoj1002)
- fire net(zoj1002)
- zoj1002-Fire Net
- [题解] ZOJ1002 -- Fire Net
- ZOJ1002 FIRE NET
- [DFS]zoj1002 Fire Net
- zoj1002 Fire Net
- 【图论】[ZOJ1002]Fire Net
- zoj1002-Fire Net
- HDU1045&&ZOJ1002-Fire Net
- 【巧妙消维DP】【HDU2059】龟兔赛跑
- POJ1502(Dijkstra)
- HomeworldSDL终于在Linux虚拟机上跑起来了
- 利用函数求阶乘
- C++内存管理与指针的使用
- zoj1002(Fire Net)
- [ACM] SDUT 2883 Hearthstone II (第二类Stiring数)
- 'Could not load NIB in bundle: 'NSBundle解决办法
- 有关lua,luci的介绍
- HDOJ1019最大公约与最小公倍
- uva Happy Number
- c++内存管理机制
- js中的继承
- Schema的快速入门