这个函数是用来获取当前节点的左边的宽度:
private int getRootPos(int x){ return l==null? x : x + l.getWidth(); }
之后我们可以通过这两行代码结合图片知道:
buf[y][p2] = ‘|’;
for(int i=p1; i<=p3; i++) buf[y+1][i]=’-’;
第y行只用来表示|符号
第y+1行用来表示/和----和根节点
p1的位置就代表左孩子结点的位置,p2代表右孩子结点的位置。
又通过分析填空之前的范围for(int i=0; i<sv.length(); i++)可以发现刚好是根节点的这个字的长度,又结合for(int i=p1; i<=p3; i++) buf[y+1][i]=’-’;可以知道原先是将整个范围内圈赋值为—,之后通过我们要填的这段代码将根节点的值赋进去所以分析得出,最后填的代码应该是;buf[y+1][p2+i]=sv.charAt(i);
接下来就是我填进去之后运行的结果:
第四题:
标题:穿越雷区
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:
则程序应该输出:
10
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
这里的主要思想就是深搜,以及剪枝这里剪枝可以通过下标的位置是否合乎范围来剪枝就比如:
if(i<0||i>n-1||j<0||j>n-1) return;
之后还有一点就是,只能走自己附近的点就是上下左右,所以我们可以通过一个数组来实现即:
public static int dir[][]=new int[][]{{-1,0},{0,1},{1,0},{0,-1}};
之后就比较简单了,以下是源代码;
import java.util.Scanner; public class num04 { public static int n; public static int i1,j1; public static int count=0; public static int min; public static boolean flag=false; public static char map[][]; public static int visit[][]; public static int dir[][]=new int[][]{{-1,0},{0,1},{1,0},{0,-1}}; public static void dfs(int i,int j) { int ii,jj; if(map[i][j]=='B') { flag=true; if(count<min) min=count; return ; } if(i<0||i>n-1||j<0||j>n-1) return; for(int k=0;k<4;k++) { ii=i+dir[k][0]; jj=j+dir[k][1]; if(ii<0||ii>n-1||jj<0||jj>n-1) continue; if(visit[ii][jj]==0&&map[ii][jj]!=map[i][j]) { visit[ii][jj]=1; count++; dfs(ii, jj); count--; visit[ii][jj]=0; } } } public static void main(String[] args) { Scanner sc=new Scanner(System.in); n=sc.nextInt(); sc.nextLine(); map=new char[n][n]; visit=new int [n][n]; min=n*n; String []str1=new String[n]; String []str2=new String[n]; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { visit[i][j]=0; } } for(int i=0;i<n;i++) { str1[i]=sc.nextLine(); str2[i]=str1[i].replace(" ", ""); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { map[i][j]=str2[i].charAt(j); if(map[i][j]=='A') { i1=i; j1=j; visit[i1][j1]=1; } } } dfs(i1, j1); if(flag) System.out.println(min); else System.out.println(-1); } }
作者很菜,如有不足,请指教