cf#301-C. Ice Cave-BFS
来源:互联网 发布:qq群刷花软件 编辑:程序博客网 时间:2024/05/21 19:43
http://codeforces.com/contest/540/problem/C
题意 给n*m的地图
只能走.不能走X,并且点.被走了之后会变成X,问能否从点1走到点2,并且要求最后点2要是X(为了掉到下一level)
因此直接bfs搜,每次走过 点 后把 点变成X ,最后判断能否到达点2 并且点2状态为 X即可
另一种是直接判断能不能到点2,然后如果点2本身是X则输yes,
如果是点的话,只需要看能否往外走一步然后退回来即可
即看四周有没一个合法的点,
合法的点首先要是【点】,其次没被访问过,如果被访问过 【访问的步数必须==到达点2的步数-1】
1:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; __int64 min(__int64 a,__int64 b){return a<b? a:b ;} __int64 max(__int64 a,__int64 b) {return a>b?a:b;}int n,m;char mp[505][505];int vis[505][505];int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};struct node{int x,y;int step;node(){}node(int a,int b,int c){x=a,y=b;step=c;}};queue<node> q;node st,ed;int main(){ int i;cin>>n>>m;int x,y;for (i=1;i<=n;i++){scanf("%s",mp[i]+1);}scanf("%d%d",&st.x,&st.y);scanf("%d%d",&ed.x,&ed.y);int flag=0;st.step=0;q.push(st);while(!q.empty()){node tp=q.front();q.pop();for (i=0;i<4;i++){int x=tp.x+dx[i];int y=tp.y+dy[i];if (x<1||x>n||y<1||y>m) continue;//if (vis[x][y])continue;if (x==ed.x&&y==ed.y&&mp[x][y]=='X'){flag=tp.step+1;break;}if (mp[x][y]=='X')continue;mp[x][y]='X';//vis[x][y]=tp.step+1;q.push(node(x,y,tp.step+1));}if (flag)break; }if(flag){ printf("YES\n"); }else{printf("NO\n");}return 0; }
2:
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>#include <iostream>using namespace std;const double pi=acos(-1.0);double eps=0.000001; __int64 min(__int64 a,__int64 b){return a<b? a:b ;} __int64 max(__int64 a,__int64 b) {return a>b?a:b;}int n,m;char mp[505][505];int vis[505][505];int dx[]={0,0,1,-1};int dy[]={1,-1,0,0};struct node{int x,y;int step;node(){}node(int a,int b,int c){x=a,y=b;step=c;}};queue<node> q;node st,ed;int main(){ int i;cin>>n>>m;int x,y;for (i=1;i<=n;i++){scanf("%s",mp[i]+1);}scanf("%d%d",&st.x,&st.y);scanf("%d%d",&ed.x,&ed.y);int flag=0;st.step=0;q.push(st);int lastx,lasty;while(!q.empty()){node tp=q.front();q.pop();for (i=0;i<4;i++){int x=tp.x+dx[i];int y=tp.y+dy[i];if (x<1||x>n||y<1||y>m) continue;if (vis[x][y])continue;if (x==ed.x&&y==ed.y){flag=tp.step+1;lastx=tp.x,lasty=tp.y;break;}if (mp[x][y]=='X')continue;vis[x][y]=tp.step+1;q.push(node(x,y,tp.step+1));}if (flag)break; }if(flag){if (mp[ed.x][ed.y]=='X') printf("YES\n");else{int cun=0;for (i=0;i<4;i++){int x=ed.x+dx[i];int y=ed.y+dy[i];if (x<1||x>n||y<1||y>m) continue; if (mp[x][y]=='X')continue; if ((vis[x][y]&&vis[x][y]<flag-1))continue; if (x==lastx&&y==lasty) continue;cun++;}if (cun>=1) printf("YES\n");elseprintf("NO\n");}}else{printf("NO\n");}return 0; }
0 0
- cf#301-C. Ice Cave-BFS
- CF #301 504C C. Ice Cave BFS
- C. Ice Cave (CF #301 (Div. 2) 搜索bfs)
- Ice Cave-CF-C(bfs)
- cf 540 C Ice Cave
- cf 540-C. Ice Cave
- Codeforces Round #301 (Div. 2)C - Ice Cave-bfs
- Codeforces Round #301 (Div. 2) C. Ice Cave(BFS)
- 【Codeforces】C. Ice Cave(bfs)
- CodeForces 540C Ice Cave (BFS)
- CodeForces 540 C Ice Cave (BFS)
- codeforces 540C Ice Cave【BFS】
- Codeforces 540C Ice Cave (BFS)
- CF Ice Cave
- Ice Cave(BFS)
- Codeforces Round #301 (Div. 2)C. Ice Cave(广搜BFS)
- #301 (div.2) C. Ice Cave
- Codeforces 301(div 2) C. Ice Cave
- Android Studio快捷键20160406
- Qt在windows与Mac OS中获取执行程序版本号
- C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据
- POJ 3294 n个串中至少一半的串共享的最长公共子串
- Count ways to reach the n’th stair
- cf#301-C. Ice Cave-BFS
- Windows下使用winpcap-2.2arp探测局域网内主机(接收并解析arp数据包)
- ADRMS 和 Exchange 集成
- 第一篇博文
- PHP学习(十一)--数组与数据结构
- 403 Forbidden
- PyQt4参考文档
- Java注释Override、Deprecated、SuppressWarnings详解
- C#当窗体大小改变时,窗体中的控件大小也随之改变