2018期末上机汇总(2)

B09:变换的迷宫  http://cxsjsx.openjudge.cn/2018ftall/B09/

题目并不难,主要是不要写bug就行。典型的bfs,现在bfs最需要考虑的地方就是vis数组到底记录什么。就是什么重复了就不用再继续搜索下去了。这里是t%k是一样的话就不用搜下去了,然后如果是#,那么就是只要走一次就好,因为一定是t%k==0才会走上去。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<string>
#include<queue>
#define REP(i,a,b) for(int i=(a);i<=(b);++i)
#define PER(i,a,b) for(int i=(a);i>=(b);--i)
#define INF 0x7fffffff/2
#define MAX 100010
#define ll long long
using namespace std;
int m,n,k,st[2],ed[2];
char map[110][110];
int vis[110][110][20];
int mov[4][2]={0,1,0,-1,1,0,-1,0};
struct node{
	int x,y,t;
	node(int _x,int _y,int _t):x(_x),y(_y),t(_t){}
};
queue<node> q;
int bfs(){
	node noden(st[0],st[1],0);vis[st[0]][st[1]][0]=1;
	q.push(noden);
	while(!q.empty()){
		int x1=q.front().x;
		int y1=q.front().y;
		int t1=q.front().t;
		q.pop();
		if(x1==ed[0]&&y1==ed[1])return t1;
		REP(i,0,3){
			int x2=x1+mov[i][0];
			int y2=y1+mov[i][1];
			if(x2>=1&&x2<=m&&y2>=1&&y2<=n){
				if(map[x2][y2]!='#'&&!vis[x2][y2][(t1+1)%k]){
					node noden(x2,y2,t1+1);
					vis[x2][y2][(t1+1)%k]=1;
					q.push(noden);
				}
				else if(map[x2][y2]=='#'&&!vis[x2][y2][0]&&(t1+1)%k==0){
					node noden(x2,y2,t1+1);
					vis[x2][y2][0]=1;
					q.push(noden);
				}
			}
		}
	}
	return 0;
}
int main(){
	int t;cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis));
		while(!q.empty())q.pop();
		//memset(map,0,sizeof(map));
		cin>>m>>n>>k;
		REP(i,1,m)REP(j,1,n){
			cin>>map[i][j];
			if(map[i][j]=='S'){
				st[0]=i;st[1]=j;
			}
			else if(map[i][j]=='E'){
				ed[0]=i;ed[1]=j;
			} 
		}
		int temp=bfs();
		if(temp)cout<<temp<<endl;
		else cout<<"Oop!"<<endl;
	}
	return 0;
}

D04:迷阵   http://cxsjsx.openjudge.cn/2018ftall/D04/

对比看一下这道题,其实也没什么难度,但是当时上机的时候一直wa,原因就是vis数组本来应该记录生命值,但是我却记录的是方向,很明显方向一样的生命值可能不同,这就是两种不同的情况。

#include<iostream>
#include<cstdio>
#include<cmath> 
#include<string>
#include<string.h>
#include<queue>
#define REP(i,a,b) for(int i=(a);i<=(b);++i)
#define INF 0x7fffffff
using namespace std;
int n,m,h;
char map[300][300];
int mov[4][2]={0,1,0,-1,1,0,-1,0};
int bfs(){
	int vis[300][300][7];memset(vis,0,sizeof(vis));
	queue<pair<pair<int,int>,pair<int,int> > > q;
	q.push(make_pair(make_pair(h,0),make_pair(1,1)));
	vis[1][1][h]=1;
	while(!q.empty()){
		int step=q.front().first.second;
		int life=q.front().first.first;
		int x=q.front().second.first;
		int y=q.front().second.second;
		q.pop();
		if(x==m&&y==n){
			return step;
		}
		REP(i,0,3){
			int x1=x+mov[i][0];
			int y1=y+mov[i][1];
			if(x1==m&&y1==n)return step+1;
			if(x1>=1&&x1<=m&&y1>=1&&y1<=n&&map[x1][y1]!='#'){
				if(map[x1][y1]=='*'&&life-1>0&&!vis[x1][y1][life-1]){
					q.push(make_pair(make_pair(life-1,step+1),make_pair(x1,y1)));
					vis[x1][y1][life-1]=1;
					//cout<<x1<<' '<<y1<<' '<<life-1<<' '<<step+1<<endl;
				}
				else if(!vis[x1][y1][life]&&map[x1][y1]=='.'&&life>0){
					q.push(make_pair(make_pair(life,step+1),make_pair(x1,y1)));
					vis[x1][y1][life]=1;
					//cout<<x1<<' '<<y1<<' '<<life<<' '<<step+1<<endl;
				}
			}
		}
	}
	//return 0;
}
int main() {
	int t;cin>>t;
	while(t--){
		cin>>m>>n>>h;
		REP(i,1,m)REP(j,1,n)cin>>map[i][j];	
		//REP(i,1,m)REP(j,1,n)cout<<map[i][j];
		cout<<bfs()<<endl;
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/yhjpku/article/details/80792894