经典c程序(0037) ---PCB布线BFS

这段代码演示了一个经典的C程序,用于寻找印刷电路板上两点间(A到B)的最短布线路径。程序采用宽度优先搜索(BFS)策略,避开被封锁的格子,返回最短路径长度或布线失败(-1)。如果找不到起点A或终点B,或者被封锁的格子导致无法连通,也会返回布线失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**************************************************************************************
* Function     : test
* Create Date  : 2014/07/11
* Author       : NTSK13
* Email        : beijiwei@qq.com
* Copyright    : 欢迎大家和我一起交流学习,转载请保持源文件的完整性。
*                任何单位和个人不经本人允许不得用于商业用途
* Version      : V0.1
***************************************************************************************
经典c程序(0037)

题目:问题描述

印刷电路板将布线区域划分成10*10个方格阵列。要求确定连接方格A的中点到方格B的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图EX1所示。为了避免线路相交,对已经布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格,如图EX2所示。

题目要求

1.     点A点B和封锁标记X为随机分布;

2.     从A点到B点之间的路径点可使用1,2,3,4,5,…表示;

3.     请写出正确的run_test函数,返回正确的路径长度(int),或布线失败(返回-1);

4.     请考虑出各种可能性,如不存在点A或点B,或封锁不能连通等情况,均为布线失败;

**************************************************************************************/

#define SIZE  10

int offset[4][2]={-1,0,0,1,1,0,0,-1};

typedef struct {
	int x;
	int y;
	int layer;//本位置接下来进栈的个数
}Stack;

Stack array[SIZE*SIZE];
int visited[SIZE][SIZE];
int data[SIZE][SIZE];

int run_test(int PCB[SIZE][SIZE])

{
	int k=0,min=SIZE*SIZE+1;
	int i=0,j=0,a=-1,b=-1,c=-1,d=-1;

    // WRITE YOUR CODES HEAR
	for(i=0;i<SIZE*SIZE;i++)
	{
		array[i].x=-2;
		array[i].y=-2;
		array[i].layer=-2;
	}
	for(i=0;i<SIZE;i++)
	for(j=0;j<SIZE;j++)
	{
		data[i][j]=PCB[i][j];
		visited[i][j]=0;
		if(PCB[i][j]==65)//A点
		{
			a=i;
			b=j;
		}
		if(PCB[i][j]==66)//B点
		{
			c=i;
			d=j;
		}
	}
	if( (a==-1 && b==-1) || (c==-1 && d==-1)  )
		return -1;
/************************************BFS*******************************************/
	int rear=0,front=1,x=0,y=0;
	array[0].x=a;//原点进栈
	array[0].y=b;
	array[0].layer=0;// 初始化层数

	while( !(array[rear].x==-2 && array[rear].y==-2) )
	{
		x=array[rear].x;//获取栈中保存的坐标
		y=array[rear].y;

		for(k=0;k<4;k++)
		{
			if( x+offset[k][0]>=0 && x+offset[k][0] < SIZE &&
				y+offset[k][1]>=0 && y+offset[k][1] < SIZE &&
				visited[ x+offset[k][0] ][ y+offset[k][1] ] ==0
			)
			{
				if( data[ x+offset[k][0] ][ y+offset[k][1] ] !=88 &&
					data[ x+offset[k][0] ][ y+offset[k][1] ] !=65 &&
					data[ x+offset[k][0] ][ y+offset[k][1] ] !=66
					)//符合条件进栈
				{
					array[front].x=x+offset[k][0];
					array[front].y=y+offset[k][1];
					array[front].layer=array[rear].layer+1;
					front++;
				}
				visited[ x+offset[k][0] ][ y+offset[k][1] ]=1;//该点被访问
			}
		}
		if(array[rear].layer>0)
			data[x][y]=array[rear].layer;
		rear++;
	}

/**********************************************************************************/
	for(k=0;k<4;k++)
	{
		if( c+offset[k][0] >= 0 && c+offset[k][0] < SIZE &&
			d+offset[k][1] >= 0 && d+offset[k][1] < SIZE &&
			data[ c+offset[k][0] ][ d+offset[k][1] ] !=0
		  )
		{
			if(min > data[ c+offset[k][0] ][ d+offset[k][1] ] )
				min  = data[ c+offset[k][0] ][ d+offset[k][1] ];
		}
	}
	if(min==SIZE*SIZE+1)
		return -1;
	else
		return min+1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值