题意
给一个nxm的4联通地图 你从1,1 到n,m 。
0为可走的,1为障碍物
最多连续跨个K个障碍物。
求所需要的最小的步数。
WA1
题意理解错误 , 以为能够跨越K个障碍物,只能够横向和纵向。所以错了
WA2
题意理解正确了 重新开了一个mp2[maxn][maxn]记录穿越障碍物的个数,但是未考虑一个问题,就是一个点,可能由被穿越2次记录,可能由被穿越1次记录,所以,遇到比较原mp2[][]小的,就再次加入队列进行BFS
AC代码
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <sstream>
#include <string>
#define maxn 23
#define inf 0x3f3f3f3f3f
using namespace std;
struct node{
int x;
int y;
node(int x,int y){
this->x=x;
this->y=y;
}
};
int go[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
int mp[maxn][maxn];
int mp1[maxn][maxn];
int mp2[maxn][maxn];
int bfs(node f,node e,int k){
queue <node> q;
q.push(f);
mp[f.x][f.y]=0;
memset(mp2,inf,sizeof(mp2));
mp2[f.x][f.y]=0;
if(f.x==e.x&&f.y==e.y)
return 0;
while(!q.empty()){
node p=q.front();
q.pop();
int x=p.x,y=p.y;
for(int i = 0 ; i<4 ; i++){
int xx=x,yy=y;
xx+=go[i][0];
yy+=go[i][1];
if(xx<=e.x&&xx>0&&yy<=e.y&&yy>0){
if(mp[xx][yy]==-1||mp2[x][y]+1<mp2[xx][yy]){
if(mp1[xx][yy])
mp2[xx][yy]=min(mp2[xx][yy],mp2[x][y]+1);
else mp2[xx][yy]=0;
if(mp2[xx][yy]<=k){
q.push(node(xx,yy));
mp[xx][yy]=mp[x][y]+1;
}
if(xx==e.x&&yy==e.y)
return mp[xx][yy];
}
}
}
}
/*for(int i = 1 ; i<=e.x ; i++){
for(int j = 1 ; j<=e.y ; j++)
printf("%d ",mp2[i][j]);
printf("\n");
}*/
return -1;
}
int main(){
//freopen("f:\\in.txt","r",stdin);
//freopen("f:\\out.txt","w",stdout);
int m,n,k;
int t;
scanf("%d",&t);
int ca=0;
while(t--){
scanf("%d%d%d",&m,&n,&k);
memset(mp,-1,sizeof(mp));
for(int i = 1 ; i <= m ; i++){
for(int j = 1 ; j<=n ; j++){
scanf("%d",&mp1[i][j]);
}
}
printf("%d\n",bfs(node(1,1),node(m,n),k));
}
}
给一组测试数据
17 3
15
0 1 0
1 1 1
1 0 1
1 1 1
1 1 1
1 0 0
1 1 1
1 1 1
1 1 0
1 1 1
1 0 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 1
1 1 0
结果
-1 225