poj3009 Curling 2.0
来源:互联网 发布:烘焙论坛知乎 编辑:程序博客网 时间:2024/04/29 20:33
题目:http://poj.org/problem?id=3009
题意:就是要求把一个冰壶从起点“2”用最少的步数移动到终点“3”。其中0为移动区域,1为石头区域,冰壶一旦想着某个方向运动就不会停止,也不会改变方向(想想冰壶在冰上滑动),除非冰壶撞到石头1 或者 到达终点 3。冰壶撞到石头后,冰壶会停在石头前面,该块石头会破裂,石头所在的区域由1变为0。
想法:dfs深搜。四个方向。直接看代码吧。今天做这道题回溯搞得我头昏眼涨。一开始写出来这道题能想到的测试组数都对,就是WA到死。本来都打算放弃了,后来看了一下题解,稍微改了改就对了。。。为什么呢?求大神指点啊!!!!
代码(AC):
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dx[4]={1,-1,0,0};int dy[4]={0,0,-1,1};int map[25][25];int w,h;int sx,sy;int ans;int ok(int i,int j){ if(i>=1&&i<=h&&j>=1&&j<=w) return 1; return 0;}void dfs(int x,int y,int time){ if(time>=10) return ; for(int i=0;i<4;i++){ int px=x+dx[i]; int py=y+dy[i]; if(map[px][py]==1) continue; while(map[px][py]==0){ px+=dx[i]; py+=dy[i]; } if(ok(px,py)) { if(map[px][py]==3){ ans=min(time+1,ans); } if(map[px][py]==1){ map[px][py]=0; dfs(px-dx[i],py-dy[i],time+1); map[px][py]=1; } } } return ;}int main(){ //freopen("123.txt","r",stdin); while(~scanf("%d%d",&w,&h)&&w&&h){ memset(map,1,sizeof(map)); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ scanf("%d",&map[i][j]); if(map[i][j]==2){//2处冰壶也可以滑动,变为0. sx=i; sy=j; map[i][j]=0; } } } ans=11; dfs(sx,sy,0); if(ans!=11) printf("%d\n",ans); else printf("-1\n"); } return 0;}
WA:
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dx[4]={1,-1,0,0};int dy[4]={0,0,-1,1};int map[25][25];bool vis[25][25];int w,h;int sx,sy;int ans;void dfs(int x,int y,int time){ if(time>=10) return ; if(ans) return ; for(int i=0;i<4;i++){ int px=x+dx[i]; int py=y+dy[i]; if(map[px][py]==1) continue; while(map[px][py]==0){ px+=dx[i]; py+=dy[i]; } if(px<=0||px>h||py<=0||py>w) continue; if(map[px][py]==3){ ans=time+1; return ; } if(px>0&&px<=h&&py>0&&py<=w&&map[px][py]&&!vis[px][py]){ map[px][py]=0; vis[px][py]=true; dfs(px-dx[i],py-dy[i],time+1); map[px][py]=1; vis[px][py]=true; } } return ;}int main(){ //freopen("123.txt","r",stdin); while(~scanf("%d%d",&w,&h)&&w&&h){ memset(map,1,sizeof(map)); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ scanf("%d",&map[i][j]); if(map[i][j]==2){ sx=i; sy=j; map[i][j]=0; } } } memset(vis,false,sizeof(vis)); ans=0; dfs(sx,sy,0); if(ans) printf("%d\n",ans); else printf("-1\n"); } return 0;}
0 0
- POJ3009:Curling 2.0(DFS)
- POJ3009--Curling 2.0
- poj3009 Curling 2.0
- poj3009 Curling 2.0---bfs
- poj3009 Curling 2.0
- poj3009 Curling 2.0
- POJ3009 Curling 2.0(DFS)
- POJ3009 Curling 2.0
- POJ3009---Curling 2.0
- POJ3009 Curling 2.0
- POJ3009 Curling 2.0 DFS
- POJ3009 Curling 2.0【DFS】
- poj3009 Curling 2.0
- POJ3009 Curling 2.0(DFS)
- POJ3009-Curling 2.0
- POJ3009 Curling 2.0
- POJ3009-Curling 2.0
- poj3009 Curling 2.0
- 第一篇博客
- Android T卡升级时,在recovery模式下升级完成后将手动重启修改为自动重启
- Android.View.InflateException: Binary XML File Line #异常的解决
- 例题2-1 计算圆面积
- C#----对时间结构DateTime的使用(时间日期的使用)
- poj3009 Curling 2.0
- List,Set,Map三种接口的区别
- 关于lua table的实现
- 如何解决使用keil下载或者调试程序是提示的“Invalid ROM Table”信息!
- Context in android
- Android4.2.2 SurfaceFlinger的相关事件和消息处理机制
- Python中的 __all__和__path__ 解析
- (20)使用System.in的BufferedReader对象,读取数据并输出到System.out上
- SIP服务器,搭建自己的VoIP平台 (windows版本)