NC21561. 小乐乐打游戏
描述
输入描述
多组样例输入
第一行给定n,m,(1 <= n, m <= 1000)代表地图的大小。
接下来n行,每一行m个字符,代表地图,对于每一个字符,如果是'.',代表是平地,'S'代表小乐乐起始的位置,
'E'代表终点,'#'代表障碍物,'F'代表火山口。
输出描述
输出只有一行。如果小乐乐能吃猪,输出"PIG PIG PIG!"。否则输出"A! WO SI LA!"。
示例1
输入:
3 3 F.. #S# #.E
输出:
PIG PIG PIG!
C++14(g++5.4) 解法, 执行用时: 63ms, 内存消耗: 2540K, 提交时间: 2018-12-01 17:05:31
#include<cstdio> #include<queue> #include<cstring> #include<cstdlib> using namespace std; struct Node{ int x,y,t; Node(){} Node(int a,int b,int c){ x=a,y=b,t=c; } }N; const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int n,m,fx,fy,sx,sy,ex,ey; char s[1108][1108]; bool book[1108][1108]; bool bfs() { queue<Node> q; q.push(Node(sx,sy,0)); memset(book,0,sizeof(book)); book[sx][sy]=1; while(q.size()) { N=q.front(); q.pop(); if(N.x==ex&&N.y==ey) return 1; for(int i=0;i<4;i++) { int dx=N.x+dir[i][0]; int dy=N.y+dir[i][1]; if(dx<0||dx>=n||dy<0||dy>=m) continue; if(book[dx][dy]||s[dx][dy]=='#'||abs(dx-fx)+abs(dy-fy)<=N.t) continue; book[dx][dy]=1; q.push(Node(dx,dy,N.t+1)); } } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) { scanf("%s",s[i]); for(int j=0;j<m;j++) if(s[i][j]=='F') fx=i,fy=j; else if(s[i][j]=='E') ex=i,ey=j; else if(s[i][j]=='S') sx=i,sy=j; } if(bfs()) printf("PIG PIG PIG!\n"); else printf("A! WO SI LA!\n"); } return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 283ms, 内存消耗: 5088K, 提交时间: 2018-12-15 23:41:36
#include<bits/stdc++.h> using namespace std; char ma[1001][1001]; int vis[1001][1001]; int dir[4][2]= {0,1,1,0,-1,0,0,-1}; int n,m; struct pos{ int x; int y; int s; }hs,xl,zd; int bfs(void) { memset(vis,0,sizeof(vis)); queue<pos>q; vis[xl.x][xl.y]=1; q.push(xl); while(!q.empty()) { pos now=q.front(); q.pop(); if(now.x==zd.x&&now.y==zd.y) return 1; for(int i=0;i<4;i++) { pos next=now; next.x=now.x+dir[i][0]; next.y=now.y+dir[i][1]; next.s+=1; if(!vis[next.x][next.y]&&ma[next.x][next.y]!='#'&&abs(next.x-hs.x)+abs(next.y-hs.y)>next.s) if(0<=next.x && next.x<n && 0<=next.y && next.y<m) vis[next.x][next.y]=1,q.push(next); } } return 0; } int main(void) { int i,j; while(cin>>n>>m) { for(i=0;i<n;i++) cin>>ma[i]; for(i=0;i<n;i++) for(j=0;j<m;j++) { if(ma[i][j]=='F') hs.x=i,hs.y=j; if(ma[i][j]=='S') xl.x=i,xl.y=j; if(ma[i][j]=='E') zd.x=i,zd.y=j; } if(bfs()) cout<<"PIG PIG PIG!"<<endl; else cout<<"A! WO SI LA!"<<endl; } }