http://oj.ecustacm.cn/problem.php?id=1399
不会写,还会往回走,三维数组不会想。
下面是不会往回走的代码: 是错误的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
const int N=100;
char map[N][N];
bool judge[N][N]={false};
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,k;
struct node
{
int x,y,step;
int sum;
bool state;
}Node;
void bfs(int x,int y)
{
queue<node>q;
Node.x=x;
Node.y=y;
Node.step=0;
Node.state=false;
Node.sum=0;
judge[x][y]=true;
q.push(Node);
while(!q.empty())
{
node w=q.front();
q.pop();
if(w.x==n&&w.y==n)
{
cout<<w.step<<endl;
return;
}
for(int i=0;i<4;i++)
{
int tempx=w.x+dx[i];
int tempy=w.y+dy[i];
if(tempx>=1&&tempx<=n&&tempy>=1&&tempy<=n&&map[tempx][tempy]!='#'&&!judge[tempx][tempy])
{
if(map[tempx][tempy]=='X'&&w.state)//如果是陷阱,且无敌
{
judge[tempx][tempy]=true;
node m;
m.x=tempx;
m.y=tempy;
m.step=w.step+1;
if(w.sum>1)
{
m.sum=w.sum-1;
m.state=true;
}
else
{
m.sum=0;
m.state=false;
}
q.push(m);
continue;
}
if(map[tempx][tempy]=='%')//如果是无敌卡
{
map[tempx][tempy]='.';
judge[tempx][tempy]=true;
node m;
m.x=tempx;
m.y=tempy;
m.step=w.step+1;
m.sum=w.sum+k-1;
m.state=true;
q.push(m);
continue;
}
if(map[tempx][tempy]=='.')//平路
{
judge[tempx][tempy]=true;
node m;
m.x=tempx;
m.y=tempy;
m.step=w.step+1;
m.sum=w.sum;
if(m.sum>1)
{
m.sum--;
m.state=true;
}
else
{
m.sum=0;
m.state=false;;
}
q.push(m);
}
}
}
}
cout<<-1<<endl;
}
int main(void)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>map[i][j];
bfs(1,1);
return 0;
}