/**************************************************************************************
* 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;
}
经典c程序(0037) ---PCB布线BFS
最新推荐文章于 2025-08-19 14:59:26 发布