您的位置:首页 > 其它

经典算法之迷宫问题

2014-04-23 16:31 267 查看
//这是一个坑,有空再填
#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;
	data[c][d]=-10;//B点
/************************************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;
		visited[ x ][ y ]=1;

		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;//该点被访问, 不可省略,特殊情况要考虑是否越界(chess越界) 
			}
		}
		if(array[rear].layer>0)
			data[x][y]=array[rear].layer;
		rear++;
	}

/**********************************************************************************/
	min  = data[ c+offset[k][0] ][ d+offset[k][1] ];
		
	if(min==-10)
		return -1;
	else
		return min;
}

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

int visited[M][M]={0};

void DFS(int x,int y, int array[M][M])
{
	int k=0,tmpx=0,tmpy=0;
	visited[x][y]=1;
	array[x][y]=2;

	for(k=0;k<4;k++)
	{
		tmpx=x+offset[k][0];
		tmpy=y+offset[k][1];
		if( tmpx >=1 && tmpx <= N &&
			tmpy >=1 && tmpy <= N &&
			visited[ tmpx ] [ tmpy ] ==0
		)
		{
			if( data[ tmpx ][ tmpy ]==1)
				DFS( tmpx , tmpy ,array);
		}

	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: