poj 3083Children of the Candy Corn

一道搜索题目,虽然挺简单,但很繁琐,在方向上纠结了好长时间。还好最后一遍AC。

#include<iostream>
#include<queue>
using namespace std;
int s_right(int dir,int tmpx,int tmpy);
int s_left(int dir,int tmpx,int tmpy);
int bfs();
const int dir_x[]={1,-1,0,0};//down up right left
const int dir_y[]={0,0,1,-1};
const int dir_left[4][4]={                               2,0,3,1,//down
						  3,1,2,0,//up						 
						  1,2,0,3,//right
						  0,3,1,2};//left
						  
const int dir_right[4][4]={                               3,0,2,1,//down
						   2,1,3,0,//up	
						   0,2,1,3,//right					   
						   1,3,0,2};//left
						   
struct Node{
	int x,y,step;
};
Node node;
bool left_Find,right_Find;
int c,r,s_x,s_y,e_x,e_y,Right,Left,Min;
char maze[50][50],Copy[50][50];
queue<Node> q;
int main(){
	int t;
	cin>>t;	
	for(int k=0;k<t;k++){
		cin>>c>>r;
		for(int i=0;i<r;i++)
		for(int j=0;j<c;j++){
			cin>>maze[i][j];
			Copy[i][j]=maze[i][j];
			if(maze[i][j]=='S'){
				s_x=i; s_y=j;
			}
			else if(maze[i][j]=='E'){
				e_x=i; e_y=j;
			}
		}
		Copy[s_x][s_y]='#'; Copy[e_x][e_y]='.';
		node.x=s_x; node.y=s_y; node.step=1;
		while(q.empty()==false)
			q.pop();
		q.push(node);
		bfs();
		Left=1; Right=1;
		left_Find=false; right_Find=false;
		if(s_x==r-1){
			s_left(1,s_x,s_y);
			s_right(1,s_x,s_y);
		}
		else if(s_x==0){
			s_left(0,s_x,s_y);
			s_right(0,s_x,s_y);
		}
		else if(s_y==0){
			s_left(2,s_x,s_y);
			s_right(2,s_x,s_y);
		}
		else if(s_y==c-1){
			s_left(3,s_x,s_y);
			s_right(3,s_x,s_y);
		}		
		cout<<Left<<" "<<Right<<" "<<Min<<endl;
	}
	system("pause");
	return 0;
}
int s_left(int dir,int tmpx,int tmpy){
	int tmp_x,tmp_y,tmp_dir;
	if(left_Find==true)
		return 0;
	for(int i=0;i<4;i++){
		tmp_x=tmpx+dir_x[dir_left[dir][i]];
		tmp_y=tmpy+dir_y[dir_left[dir][i]];
		tmp_dir=dir_left[dir][i];
		if(tmp_x==e_x&&tmp_y==e_y){
			left_Find=true;
			Left++;
			return 0;
		}
		else if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&maze[tmp_x][tmp_y]=='.'){
			Left++;
			break;
		}
	}
	s_left(tmp_dir,tmp_x,tmp_y);
	return 0;
}
int s_right(int dir,int tmpx,int tmpy){
	int tmp_x,tmp_y,tmp_dir;
	if(right_Find==true)
		return 0;
	for(int i=0;i<4;i++){
		tmp_x=tmpx+dir_x[dir_right[dir][i]];
		tmp_y=tmpy+dir_y[dir_right[dir][i]];
		tmp_dir=dir_right[dir][i];
		if(tmp_x==e_x&&tmp_y==e_y){
			right_Find=true;
			Right++;
			return 0;
		}
		else if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&maze[tmp_x][tmp_y]=='.'){
			Right++;
			break;
		}
	}
	s_right(tmp_dir,tmp_x,tmp_y);
	return 0;
}
int bfs(){
	Node tmpn;
	int tmp_x,tmp_y;
	while(q.empty()==false){
		tmpn=q.front();	
		for(int i=0;i<4;i++){
			tmp_x=tmpn.x+dir_x[i]; tmp_y=tmpn.y+dir_y[i];
			if(tmp_x>=0&&tmp_x<r&&tmp_y>=0&&tmp_y<c&&Copy[tmp_x][tmp_y]=='.'){
				node.x=tmp_x; node.y=tmp_y; node.step=tmpn.step+1;
				Min=node.step;
				Copy[tmp_x][tmp_y]='#';
				q.push(node);
			}		
		}
		q.pop();		
		if(Copy[e_x][e_y]=='#')
			break;
	}	
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值