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;
}