POJ 1324 BFS+二进制状态标记

STL容器开在函数体内和体外还能卡超时?涨姿势了

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;
const int maxr = 30, maxc = 30;
int maze[maxr][maxc],vis[maxr][maxc][1<<15];
int dir[maxr];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,-1,0,1};
int R,C,L,kase;

struct Node
{
	int x,y,st,dis;
	Node(int x,int y,int st,int dis):x(x),y(y),st(st),dis(dis){}	
};
bool check(int x,int y,Node node)
{
	if(x < 1 || y < 1 || x > R || y > C || maze[x][y]) return false;
	for(int i = L-1; i >= 1; --i)
	{
		dir[i] = node.st&3;
		node.st >>= 2;
	}
	int xx = node.x, yy = node.y;
	for(int i = 1; i < L; ++i)
	{
		xx +=  dx[dir[i]], yy += dy[dir[i]];
		if(xx == x && yy == y) return false;
	}
	return true;
}
queue<Node> q;
int BFS(Node nod)
{
	kase++;
	if(nod.x == 1 && nod.y == 1) return 0;
	while(!q.empty()) q.pop();
	q.push(nod); vis[nod.x][nod.y][nod.st] = kase;
	while(!q.empty())
	{
		Node tmp = q.front(); q.pop();
		for(int i = 0; i < 4; ++i)
		{
			int nx = tmp.x + dx[i], ny = tmp.y + dy[i];
			if(nx == 1 && ny == 1) return tmp.dis+1;
			if(!check(nx,ny,tmp)) continue;
			int ndis = tmp.dis + 1, nst = (tmp.st >> 2) + (((i+2)%4) << (2*(L-2)));
			if(vis[nx][ny][nst]==kase) continue;
			vis[nx][ny][nst] = kase;
			q.push(Node(nx,ny,nst,ndis));
		}
	}
	return -1;
}
int main()
{
	while(~scanf("%d%d%d",&R,&C,&L) && (R+C+L))
	{
		int x,y,nx,ny;
		Node node(0,0,0,0);
		scanf("%d%d",&node.x,&node.y);
		x = node.x, y = node.y;
		for(int i = 1; i < L; ++i)
		{
			scanf("%d%d",&nx,&ny);
			for(int i = 0; i < 4; ++i)
			{
				if(x + dx[i] == nx && y + dy[i] == ny)
				{
					node.st = (node.st << 2) + i;
					break;
				}
			}
			x = nx, y = ny;
		}
		int blocks; scanf("%d",&blocks);
		memset(maze,0,sizeof(maze));
		for(int i = 0; i < blocks; ++i)
		{
			scanf("%d%d",&x,&y); 
			maze[x][y] = 1;
		}
		printf("Case %d: %d\n",kase,BFS(node));
	}
}

 

全部评论

相关推荐

冰皮月饼_FLORRIEEE:你是准备投产品嘛?可以重新整理一下实习的bulletpoint,侧重描述你的工作所带来的结果收益,不要只写泛泛的内容(比如改写通过xx数据分析,提升xx),产品的价值并不在处理和分析数据的过程
点赞 评论 收藏
分享
会员标识
02-20 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务