HDU 1072 Nightmare【广搜】
分析: 给一个地图,一个人从起点开始,身上有一个定时炸弹,时间为6,每走一步花费一个时间,走到标号为4 的点上时时间重置,
问从起点到终点最少需要经过多少步。
分析: 直接广搜,加上对状态的判重。。。
View Code
#include<stdio.h> #include<string.h> struct node { int x,y,time,step; }q[1000],st,en,tt,xx; int f[8]={-1,0,0,1,0,-1,1,0}; int a[10][10]; int b[10][10]; int v[10][10][7]; int main() { int front,rear,t,n,m,i,j,res; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); if(a[i][j]==2){ st.x=i; st.y=j; } else if(a[i][j]==3){ en.x=i; en.y=j; } } memset(v,0,sizeof(v)); front=rear=0; q[rear].x=st.x; q[rear].y=st.y; q[rear].time=6; q[rear++].step=0; v[st.x][st.y][6]=1; res=9999; while(front<rear) { xx=q[front++]; for(i=0;i<4;i++) { tt.x=xx.x+f[i]; tt.y=xx.y+f[i+4]; tt.time=xx.time-1; if(tt.x>=1&&tt.x<=n&&tt.y>=1&&tt.y<=m&&a[tt.x][tt.y]&&tt.time>0&&!v[tt.x][tt.y][tt.time]) { v[tt.x][tt.y][tt.time]=1; tt.step=xx.step+1; if(a[tt.x][tt.y]==4) tt.time=6; if(a[tt.x][tt.y]==3&&tt.step<res) res=tt.step; q[rear++]=tt; } } } if(res!=9999) printf("%d\n",res); else printf("-1\n"); } return 0; }



浙公网安备 33010602011771号