洛谷 P1301 魔鬼之城

P1301 魔鬼之城

洛谷 P1301 魔鬼之城_第1张图片

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define lowbit(x) (x&-x)
#define debug cout<<"What fuck!!"<
#define fcio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e2+10;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
int mp[maxn][maxn];
int vis[maxn][maxn][8];//vis多开一维,存方向 
int n,m;
int d[8][2]={
     {
     1,0},{
     -1,0},{
     0,1},{
     0,-1},{
     1,1},{
     1,-1},{
     -1,1},{
     -1,-1}};
struct node{
     
	int x,y,step,pre;
};
bool ok(int x,int y,int z){
     
	if(x<1||x>n||y<1||y>m)
		return false;
	if(vis[x][y][z])
		return false;
	return true;
}
int bfs(){
     
	queue<node>q;
	node last,next;
	memset(vis,0,sizeof vis);
	last.x=1,last.y=1,last.step=0,last.pre=-1;
	vis[1][1][0]=1;
	q.push(last);
	while(!q.empty()){
     
		last=q.front();
		q.pop();
//		cout<
		if(last.x==n&&last.y==m){
     
			return last.step;
		}
		int k=mp[last.x][last.y];
//		cout<
		for(int i=0;i<8;++i){
     
			if(last.pre==i)
				continue;
			next.x=last.x+k*d[i][0];
			next.y=last.y+k*d[i][1];
//			cout<<"("<
//			cout<
			if(ok(next.x,next.y,i)){
     
				vis[next.x][next.y][i]=1;
				next.step=last.step+1;
				next.pre=i;
				q.push(next);
			}
		}
	}
	return -1;
}
int main(){
     
	fcio;
	while(cin>>m>>n){
     
		for(int i=1;i<=n;++i)
			for(int j=1;j<=m;++j)
				cin>>mp[i][j];
		int ans=bfs();
		if(ans!=-1)
			cout<<ans<<endl;
		else
			cout<<"NEVER"<<endl;
	}
	return 0;
}

你可能感兴趣的:(洛谷 P1301 魔鬼之城)