队列

       所谓队列,就是一种特殊的线性表,插入和删除操作都在线性表的两端进行。特点就是先进先出,形象点就是可以联系人们排队的情景,先等待的人先完成目的。
在这里插入图片描述

       而如同栈一般,队列也分为顺序和链式两种存储结构。

1.顺序队列
       对于顺序队列而言,若使用顺序表,则出队效率低,为O(n);若使用数组,则会存在假溢出。所以综上所述,可考虑使用顺序循环队列,即在逻辑上首尾相接的循环结构,,front为队头下标,rear为队尾下标。由图可知,循环队列的所剩元素的长度为(rear-front+length)%length.在这里有插入图片描述
2.链式队列
       在链式队列中,若使用单链表,入队效率低,所以设计单链表增加尾指针,使得入队和出队操作的时间复杂度为O(1)。

实验

       布线问题:印刷电路板将布线区域划分为n×m个方格阵列。布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案要求:
      *布线时电路只能沿直线或直角布线。
      *已布线方格做上封闭标记,其他线路布线不允许穿过封闭区域。(如下图所示)
在这里插入图片描述

import java.util.Scanner;

public class Lab022 {
	public int[][] x;//方格阵列;=0表示该方格运行布线;=1表示被封锁,不允许布线
	public int size;//方格阵列大小
	public int pathLen;//最短线路长度
	public LinkedQueue<Position> q;//扩展结点队列,用list存储
	public Position start;//起始位置
	public Position end;//终点
	public Position[] path;//最短路径
	public Lab022(int[][] grid,int size,Position start,Position end){
		this.x=grid;
		this.size=size;
		this.start=start;
		this.end=end;
	}
	
	public static class Position{
		public int row;//行
		public int col;//列
		
		public Position(int r ,int c){
			row=r;
			col=c;
		}
	}
	public boolean search(){
		if(start.row==end.row&&start.col==end.col){//start==finish,最短路径为0
			pathLen=0;
			return true;
		}
		//初始化相对位移
		Position[] s=new Position[4];
		s[0]=new Position(0,1);//右
		s[1]=new Position(1,0);//下
		s[2]=new Position(0,-1);//左
		s[3]=new Position(-1,0);//上
		
		//设置方格阵列“围墙”,方便处理方格边界的情况
		for(int i=0;i<=size+1;i++){
			x[0][i]=x[size+1][i]=1;//顶部和底部
			x[i][0]=x[i][size+1]=1;//左边和右边
		}
		
		Position here=new Position(start.row,start.col);
		x[start.row][start.col]=2;//数字0,1表示方格的开放或封锁所以,表示距离时,让所有距离都加2;起始位置的距离为0+2=2
		int number=4;//相邻方格数
		
		//以下为标记可达的方格位置
		q=new LinkedQueue<Position>();
		Position ber=new Position(0,0);
		do{
			//标记可达的相邻方格
			for(int i=0;i<number;i++){
				ber.row=here.row+s[i].row;
				ber.col=here.col+s[i].col;
				if(x[ber.row][ber.col]==0){//该方格未被标记,且该方格允许布线
					x[ber.row][ber.col]=x[here.row][here.col]+1;
					if(ber.row==end.row&&ber.col==end.col)
						break;
					q.add(new Position(ber.row,ber.col));
				}
			}
			//检测是否到达目标位置finish
			if(ber.row==end.row&&ber.col==end.col)
				break;
			if(q.isEmpty())
				return false;
			here=q.poll();
		}while(true);
		//构造最短布线路径
		pathLen=x[end.row][end.col]-2;
		path=new Position[pathLen];
		
		//从目标位置finish回溯起始位置
		here=end;
		for(int j=pathLen-1;j>=0;j--){
			path[j]=here;
			for(int i=0;i<number;i++){
				ber.row=here.row+s[i].row;
				ber.col=here.col+s[i].col;
				if(x[ber.row][ber.col]==j+2)
					break;
			}
			here=new Position(ber.row,ber.col);
		}
		System.out.println("最短路线为:");
		for(int j=0;j<pathLen-1;j++){
			System.out.println("点"+(j+1)+"位置:  ("+path[j].row+" ,"+path[j].col+")");//显示位置
		}
		System.out.println("布线长度为:"+pathLen);
		return true;
	}
	
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入方格阵列大小:");
		String s1=sc.nextLine();
		Integer size=Integer.parseInt(s1);
		
		System.out.println("请输入起始点的行和列,用空格隔开:");
		String s2=sc.nextLine();
		String[] s3=s2.split(" ");
		int startRow=Integer.parseInt(s3[0]);
		int startCol=Integer.parseInt(s3[1]);
		Position start=new Position(startRow,startCol);
		
		System.out.println("请输入结束点的行和列,用空格隔开:");
		String s4=sc.nextLine();
		String[] s5=s4.split(" ");
		int finishRow=Integer.parseInt(s5[0]);
		int finishCol=Integer.parseInt(s5[1]);
		Position end=new Position(finishRow,finishCol);
		
		int[][] x=new int[size+2][size+2];
		System.out.println("请输入方格阵列:");
		for(int i=1;i<=size;i++){
			String str=sc.nextLine();
			String[] strs=str.split(" ");
			for(int j=0;j<strs.length;j++){
				x[i][j+1]=Integer.parseInt(strs[j]);
			}
		}
		
		Lab022 w=new Lab022(x,size,start,end);
		w.search();		
	}
}


       
       本次专题就此结束了,若有错误,敬请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qfbt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值