BZOJ 1644 Usaco2007 Oct Obstacle Course 障碍训练课 SPFA

题目大意:给定一个有坏点的网格图,从A点走到B点,要求拐弯最少

裸SPFA……在状态那里记录下方向就好了

水水更健康~~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10100
#define P(x,y) ((x)*n-n+(y))
using namespace std;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
int n,A,B;
int map[M],f[M<<2];
void SPFA()
{
	static int q[65540];
	static bool v[M<<2];
	static unsigned short r,h;
	int i;
	memset(f,0x3f,sizeof f);
	for(i=0;i<4;i++)
		f[q[++r]=A<<2|i]=0,v[A<<2|i]=true;
	while(r!=h)
	{
		int x=q[++h];v[x]=false;
		int _x=((x>>2)-1)/n+1,_y=((x>>2)-1)%n+1,_dir=x&3;
		for(i=0;i<4;i++)
		{
			int xx=_x+dx[i],yy=_y+dy[i];
			if(xx<=0||yy<=0||xx>n||yy>n)
				continue;
			if(map[P(xx,yy)]) continue;
			int y=P(xx,yy)<<2|i;
			if(f[y]>f[x]+(i!=_dir) )
			{
				f[y]=f[x]+(i!=_dir);
				if(!v[y])
					v[y]=true,q[++r]=y;
			}
		}
	}
}
int main()
{
	int i,j;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		static char s[M];
		scanf("%s",s+1);
		for(j=1;j<=n;j++)
			switch(s[j])
			{
				case 'x':
					map[P(i,j)]=1;
					break;
				case 'A':
					A=P(i,j);
					break;
				case 'B':
					B=P(i,j);
					break;
			}
	}
	SPFA();
	cout<<min(min(f[B<<2|0],f[B<<2|1]),min(f[B<<2|2],f[B<<2|3]))<<endl;
	return 0;
}
时间: 2024-12-24 22:46:15

BZOJ 1644 Usaco2007 Oct Obstacle Course 障碍训练课 SPFA的相关文章

BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

题目 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MB Description 考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场.有些方格是奶牛们不能踏上的,它们被标记为了'x'.例如下图: . . B x .. x x A .. . . x .. x . . .. . x . . 贝茜发现自己恰好在点A处,她想去B处的盐块舔盐.缓慢而且笨拙的动物

BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课( BFS )

BFS... 我连水题都不会写了QAQ ------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define rep( i , n ) for( int i = 0 ; i &

1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved: 196[Submit][Status][Discuss] Description 考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场.有些方格是奶牛们不能踏上的,它们被标记为了'x'.例如下图: . . B x .. x x A .. . . x .. x .

BZOJ 1709: [Usaco2007 Oct]Super Paintball超级弹珠

题目 1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 329  Solved: 255[Submit][Status] Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bessie把她们玩游戏草坪划成了N * N(1 <= N<= 100)单位的矩阵,同时列出了她的 K (1 <= K &l

BZOJ 1708: [Usaco2007 Oct]Money奶牛的硬币( dp )

背包dp.. -------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #define clr( x

bzoj 1709: [Usaco2007 Oct]Super Paintball超级弹珠【枚举】

k是1e5范围的,吗? 注意到n只有100,这意味着k去重之后之后n^2,也就是1e4! 然后就可以愉快的n^4枚举了,枚举每个格子,再枚举每个敌人,如果当前格子射不到敌人则退出,否则满足所有敌人则ans++ #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=105; int n,m,tot,ans; bool v[N][N]; struct

bzoj1709[Usaco2007 Oct]Super Paintball超级弹珠*

bzoj1709[Usaco2007 Oct]Super Paintball超级弹珠 题意: n*n的网格中有k头牛.在一个格子里发射子弹可以射中本格子,同行,同列,左斜线,右斜线(就是一个米字形)的牛,问能射中所有牛的格子有几个.n≤100. 题解: 枚举所有格子,从当前格子出发按题目里的方向走累计被射中的牛即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define

1709: [Usaco2007 Oct]Super Paintball超级弹珠

1709: [Usaco2007 Oct]Super Paintball超级弹珠 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 339  Solved: 264[Submit][Status] Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bessie把她们玩游戏草坪划成了N * N(1 <= N<= 100)单位的矩阵,同时列出了她的 K (1 <= K <=

BZOJ 3407: [Usaco2009 Oct]Bessie&#39;s Weight Problem 贝茜的体重问题( dp )

01背包... ----------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; i++ ) #define clr( x , c ) m