标签:div pen i++ bsp ace img span 有一个 open
一开始按照标准bfs来写 标记为二维数组
后来按照三维数组写过了 ps大部分bfs都不会是二维数组搞定!!!
其中有一个bug弄了半个小时。。。
一开始我是先判断!vis【x】【y】【v.c】 再判断方块是否为1 是的话v.c++;否的话归零
但是 这并不科学 到另外一个方块的时候 如果数组下标内容和结构体有关的话 应该先改变状态再判断 就如同肯定是先在u的基础上改变dx dy 再判断v.x v.y 一个道理 不然会超时!因为头不对尾
#include<bits/stdc++.h> using namespace std; int m1[25][25];int n,m,chance; bool vis[25][25][25]; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; struct node { int x,y,d,c; node(int x=0,int y=0,int d=0,int c=0):x(x),y(y),d(d),c(c){} }; bool inmap(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m)return true; return false; } void bfs() { memset(vis,false,sizeof(vis)); node u(1,1,0,0); queue<node>q; q.push(u); vis[1][1][0]=true; while(!q.empty()) { u=q.front();q.pop(); if(u.x==n&&u.y==m){printf("%d\n",u.d);return;} for(int i=0;i<4;i++) { node v(u.x+dx[i],u.y+dy[i],u.d+1,u.c); if(m1[v.x][v.y]) v.c++; else v.c=0; if(v.c<=chance&&!vis[v.x][v.y][v.c]&&inmap(v.x,v.y)) { vis[v.x][v.y][v.c]=true; q.push(v); } } } printf("-1\n"); return ; } int main() { int cas;cin>>cas; while(cas--) { scanf("%d %d %d",&n,&m,&chance); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&m1[i][j]); bfs(); } }
标签:div pen i++ bsp ace img span 有一个 open
原文地址:https://www.cnblogs.com/bxd123/p/10317740.html