标签:training ++ image shape odi led print height south
#include<stdio.h> #include<iostream> #include<queue> #include<string.h> using namespace std; struct man{ short x,y,t; }; int n,m,k,energy; int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; bool tmap[101][101][1001];//前两维代表坐标,后一维表时时间:意为每个位置的每个时刻有没子弹和碉堡(这里一定要用bool,用int会超内存) bool vist[101][101][1001];//第几个时刻的位置走过否 int OK(int x,int y,int time)//返回1说明位位置的当前时间可以走,加入队列 { if(x>=0&&x<=n&&y>=0&&y<=m&&!tmap[x][y][time]&&n-x+m-y<=energy-time&&!vist[x][y][time]) { vist[x][y][time]=true; return 1; } return 0; } void bfs() { queue<man>qMan; man pMan,tpMan; int time=0,x,y; pMan.x=0; pMan.y=0; pMan.t=0; if(OK(pMan.x,pMan.y,time)) qMan.push(pMan); while(true) { time++; if(qMan.empty()||time>energy) { printf("Bad luck!\n"); return ; } while(!qMan.empty()) { pMan=qMan.front(); if(pMan.t>=time) break; qMan.pop(); pMan.t=time; if(OK(pMan.x,pMan.y,time))//可以停在原地 qMan.push(pMan); for(int e=0;e<4;e++) { tpMan=pMan; tpMan.x+=dir[e][0]; tpMan.y+=dir[e][1]; if(OK(tpMan.x,tpMan.y,time)) { if(tpMan.x==n&&tpMan.y==m) { printf("%d\n",time); return ; } qMan.push(tpMan); } } } } } int main() { char ss[3]; int map[105][105]; int tx,ty,x[105],y[105],T[105],v[105],d[105]; while(scanf("%d%d%d%d",&n,&m,&k,&energy)>0) { for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) for(int t=0;t<=energy;t++) tmap[i][j][t]=vist[i][j][t]=false; memset(map,0,sizeof(map)); for(int i=0;i<k; i++) { scanf("%s%d%d%d%d",ss,&T[i],&v[i],&x[i],&y[i]); if(ss[0]==‘N‘) d[i]=0; else if(ss[0]==‘S‘) d[i]=1; else if(ss[0]==‘W‘) d[i]=2; else if(ss[0]==‘E‘) d[i]=3; map[x[i]][y[i]]=1;//碉堡位置 } //计算每个时刻子弹和碉堡在地图的位置 for(int i=0;i<k; i++) { for(int t=1;t<=energy; t++)//一开始当前碉堡发出的子弹的每个时间运行 { tmap[x[i]][y[i]][t]=true;//每个刻碉堡的位置 //第i个碉堡一开始发的子弹运行了t时到达的位置 tx=x[i]+dir[d[i]][0]*v[i]*t; ty=y[i]+dir[d[i]][1]*v[i]*t; if(tx>=0&&tx<=n&&ty>=0&&ty<=m)//是否越界 for(int tt=t; tt<=energy; tt+=T[i])//第i个碉堡发出的子弹周期性的到达同一位置 if(!tmap[tx][ty][tt]) { //判断从第i个碉堡位置发出的子弹能否到达位置(tx,ty) int flag=0,xx=x[i],yy=y[i]; if(d[i]==0) { for( xx=x[i]-1; xx>=tx; xx--) if(map[xx][yy]) break; if(xx<tx) flag=1; } else if(d[i]==1) { for( xx=x[i]+1; xx<=tx; xx++) if(map[xx][yy]) break; if(xx>tx) flag=1; } else if(d[i]==2) { for(yy=y[i]-1; yy>=ty; yy--) if(map[xx][yy]) break; if(yy<ty) flag=1; } else { for(yy=y[i]+1; yy<=ty; yy++) if(map[xx][yy]) break; if(yy>ty) flag=1; } if(flag)//能到达,说明路过的地没有其他碉堡阻挡 tmap[tx][ty][tt]=true; } } } bfs(); } }
标签:training ++ image shape odi led print height south
原文地址:http://www.cnblogs.com/KID-XiaoYuan/p/6414520.html