杭电1045
来源:互联网 发布:wap淘宝流量来源安全吗 编辑:程序博客网 时间:2024/05/21 00:54
杭电acm1045,AC了,还是参考了别人的代码才过的。有点收获,觉得,有必要写一下感想。
这道题目,总体有2种情况会改变。每一个点,如果不插入,是一种情况,如果插入了,就会引发另外一种情况。我们要将每一个点的这2种情况都遍历分析一遍。
这道题目,开始的时候,要遍历一下所有点,判断每一个是不是可以插入,如果满足插入条件的话,就插入,修改了矩阵。在这种情况下,开始遍历下一个点。在这种情况下,遍历完所有点之后,记录最大值。
记得要回溯,将该点搞成原来的样子,再分析不插入的情况(这个时候,没什么好分析的)那样的话,我们就可以直接跳下面一个点了,重复上面的步骤,就可以了。
貌似,这个就是贪心的想法吧。
代码如下:
import java.util.Scanner;public class Main{ public byte a[][]; //表示矩阵 private int n; private int max; Main( int n ) { this.n = n; a = new byte[n][n]; max = 0; } public boolean isInsert( int row,int column ) //判断这一个点可不可以插入 { boolean h=true; boolean v=true; for( int i=column-1;i>=0;i-- ) //判断这一行是不是可以插入 { if( a[row][i]=='Z' ) //这一行已经插入了 { h = false; break; } if( a[row][i]=='X' ) { h = true; break; } } for( int j=row-1;j>=0;j-- ) //判断这一列是不是可以插入 { if( a[j][column]=='Z' ) //这一列已经插入了 { v = false; break; } if( a[j][column]=='X' ) //这一列有阻隔 { v = true; break; } } return (h&&v); } public void setMax( int k,int cur ) //找出最大值 { if( k==n*n ) //遍历超出最后一个地方 { if( max<cur ) max = cur; return; } int row = k/n; int column = k%n; if( a[row][column]=='.' ) //插入之后,开始 { if( this.isInsert(row,column) ) { a[row][column] = 'Z'; setMax( k+1,cur+1 ); //回溯 a[row][column] = '.'; } } //由于上面有回溯一遍,所以,如果第k个点插入的话,它会插入然后不断递归进去,然后恢复原状。 //如果第k个点没有插入,这个点就遍历过了,继续遍历第k+1个点 setMax( k+1,cur ); } public void prMax() { System.out.println( this.max ); } public static void main(String[] args) { int n; Scanner s = new Scanner(System.in); n = s.nextInt(); int i = 0; int j = 0; String str; while( n!=0 ) { Main m = new Main( n ); for( i=0;i<n;i++ ) { str = s.next(); byte[] b = str.getBytes(); for( j=0;j<n;j++ ) { m.a[i][j] = b[j]; } } m.setMax(0,0); m.prMax(); n = s.nextInt(); } } }
- 杭电 acm 1045
- 杭电1045
- 杭电1045
- 杭电1045
- 杭电1045 Fire Net
- 杭电1045解题报告
- 杭电 1045 Fire Net
- 杭电
- 杭电
- 杭电
- 杭电 hdu 1045 Fire Net
- 杭电hdu 1045 Fire Net dfs
- 杭电 1045题 Fire Net
- 杭电OJ 1045:Fire Net
- Fire Net 杭电1045(DFS)
- 杭电1045 Fire Net(DFS)
- 杭电1045(zoj1002)Fire Net
- Fire Net HDU杭电1045【DFS】
- Hdu 1569 方格取数(2) (网络流最大点权独立集)
- iPhone图形开发绘图小结
- nsmutalbe select
- IT人的职操与理想-2013年3月江西IDC综述与排行榜
- 编写windows service
- 杭电1045
- SICP 习题答案1.11
- 一步一步教你做ios推送
- 题目1007:奥运排序问题
- 转:Pebble智能手表的工作原理与构造解析
- C#实现RSA加密解密源码
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- 基于MPlayer的QT媒体播放器
- chapter 4.6: KMDF子架构