当前位置 : 主页 > 手机开发 > harmonyos >

BOJ 1461

来源:互联网 收集:自由互联 发布时间:2023-10-08
bfs搜索 转动平面相当于改变重力的方向 #include cstdio#include cstring#include queue#define N 110using namespace std;struct line{int x0,y0,x1,y1;bool flag; //flag=1从左到右}lines[N];struct Point{int x,y,dir;};bool vis[N][N


bfs搜索

转动平面相当于改变重力的方向


#include <cstdio>
#include <cstring>
#include <queue>
#define N 110
using namespace std;

struct line{
	int x0,y0,x1,y1;
	bool flag; //flag=1从左到右
}lines[N];

struct Point{
	int x,y,dir;
};

bool vis[N][N][4];
bool isin[N][N][4];
int dp[N][N][4]; //0表示重力向下 1表示重力向左...
int x0,y0,x1,y1;
int w,h,n;
int dir[4][2]={0,-1,-1,0,0,1,1,0};//二位数组按行存储(WA死了)

bool check(int x,int y){
	if(x>=0 && x<w && y>=0 && y<h)return 1;
	return 0;
}

int bfs(){                     //其实这里直接bfs搜即可,不用写成SPFA
	queue<Point>q;
	Point p1,p2;
	int i,j;
	memset(dp,-1,sizeof(dp));
	memset(isin,0,sizeof(isin));
	dp[x0][y0][0]=0;
	isin[x0][y0][0]=0;
	p1.x=x0,p1.y=y0,p1.dir=0,q.push(p1);
	while(!q.empty()){
		p1=q.front();
		q.pop();
		if(p1.x==x1 && p1.y==y1) return dp[x1][y1][p1.dir];
		int nowdir=(p1.dir+1)%4,x=p1.x,y=p1.y;
		while(check(x+dir[nowdir][0],y+dir[nowdir][1]) && !(x==x1 && y==y1) && !vis[x][y][nowdir]) x+=dir[nowdir][0],y+=dir[nowdir][1];
		if(dp[x][y][nowdir]==-1){
			dp[x][y][nowdir]=dp[p1.x][p1.y][p1.dir]+1;
			if(isin[x][y][nowdir]==0){
				p2.x=x,p2.y=y,p2.dir=nowdir;
				isin[x][y][nowdir]=1;
				q.push(p2);
			}
		}

		nowdir=(p1.dir+3)%4,x=p1.x,y=p1.y;
        while(check(x+dir[nowdir][0],y+dir[nowdir][1]) && !(x==x1 && y==y1) && !vis[x][y][nowdir]) x+=dir[nowdir][0],y+=dir[nowdir][1];
		if(dp[x][y][nowdir]==-1){
			dp[x][y][nowdir]=dp[p1.x][p1.y][p1.dir]+1;
			if(isin[x][y][nowdir]==0){
				p2.x=x,p2.y=y,p2.dir=nowdir;
				isin[x][y][nowdir]=1;
				q.push(p2);
			}
        }
		isin[p1.x][p1.y][p1.dir]=0;
	}
	return -1;
}

int main(){
	int t,T;
	int i,j;
	scanf("%d",&T);
	for(t=1;t<=T;t++){
		scanf("%d %d %d",&w,&h,&n);
		scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
		memset(vis,0,sizeof(vis));
		for(i=1;i<=n;i++){
			scanf("%d %d %d %d",&lines[i].x0,&lines[i].y0,&lines[i].x1,&lines[i].y1);
			if(lines[i].x0==lines[i].x1){     // ==老写错
				for(j=lines[i].y0;j<lines[i].y1;j++) vis[lines[i].x0-1][j][3]=1,vis[lines[i].x0][j][1]=1;
			}
			else{
				for(j=lines[i].x0;j<lines[i].x1;j++) vis[j][lines[i].y0-1][2]=1,vis[j][lines[i].y0][0]=1;
			}
		}
		//for(j=0;j<w;j++) vis[0][j][0]=1,vis[h-1][j][2]=1;
		//for(j=0;j<h;j++) vis[j][0][1]=1,vis[j][w-1][3]=1;
		printf("%d\n",bfs());  
	} 
}




【感谢: 龙石数据大数据分析平台技术支撑 http://www.longshidata.com/pages/government.html, 】
上一篇:JAVA学习
下一篇:没有了
网友评论