POJ 3009 Curling 2.0(dfs)
来源:互联网 发布:画图软件如何使用方法 编辑:程序博客网 时间:2024/06/09 19:47
题目意思就是一个冰壶,要从起点到达终点,你推他一把,他就沿着直线开始滑行,直到撞到一块石头,撞到石头冰壶停止,石头也会消失。但冰壶不会取代那个石头的位置,而是在原来碰撞的位置,问你10次之内能不能到达终点。
用dfs+回溯的方法暴力去搜,顺带剪枝,如果答案大于10了,就不用搜了,这个一定要剪,否则TLE。。。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define INT_MAX 1<<30#define debug cout<<xixi.time<<j<<endl;int w,h;int sx,sy;char maze[21][21];int ex,ey;bool flag;bool check;int ans;int dir;struct wode{ int x, y; int time;};bool can_not(int x, int y){ if(x<0||x>=h||y>=w||y<0 ||maze[x][y]==1) return 1; return 0;}void dfs(wode xx){ int s,t; if(can_not(xx.x-1,xx.y) &&can_not(xx.x,xx.y-1) &&can_not(xx.x+1, xx.y) &&can_not(xx.x,xx.y+1)) return; for(int j = 1;j<21;j++) { // if(check == 1) break; s = xx.x; t = xx.y+j; wode xixi; if(maze[s][t] == 1&&abs(j)==1) break; xixi.time = xx.time; xixi.x=s; xixi.y=t; if(s==ex&&t==ey) { ans = min(ans, xixi.time);// debug break; } if(!(s>=0&&s<h&&t>=0&&t<w)) break; if(s>=0&&s<h&&t>=0&&t<w &&maze[s][t] == 1&&abs(j)!=1) { maze[s][t] = 0; xixi.x-=0; xixi.y-=1; if(xixi.x==ex&&xixi.y==ey) { ans = min(ans, xixi.time); return; } xixi.time++; if(xixi.time>9) { maze[s][t] = 1; break; } dfs(xixi); maze[s][t] = 1; break; } } for(int j = 1;j<21 ;j++) { // if(check == 1) break; s = xx.x; t = xx.y-j; if(maze[s][t] == 1&&abs(j)==1) break; wode xixi; xixi.time = xx.time; xixi.x=s; xixi.y=t; if(s==ex&&t==ey) { ans = min(ans, xixi.time); break; } if(!(s>=0&&s<h&&t>=0&&t<w)) break; if(s>=0&&s<h&&t>=0&&t<w &&maze[s][t] == 1&&abs(j)!=1) { maze[s][t] = 0; xixi.x-=0; xixi.y+=1; if(xixi.x==ex&&xixi.y==ey ) { ans = min(ans, xixi.time); return; } xixi.time++; if(xixi.time>9) { maze[s][t] = 1; break; } dfs(xixi); maze[s][t] = 1; break; } } for(int j = 1;j<21 ;j++) { // if(check == 1) break; s = xx.x+j; t = xx.y; if(maze[s][t] == 1&&abs(j)==1) break; wode xixi; xixi.time = xx.time; xixi.x=s; xixi.y=t; if(s==ex&&t==ey) { ans = min(ans, xixi.time); break; } if(!(s>=0&&s<h&&t>=0&&t<w)) break; if(s>=0&&s<h&&t>=0&&t<w &&maze[s][t] == 1&&abs(j)!=1) { maze[s][t] = 0; xixi.x-=1; xixi.y-=0; if(xixi.x==ex&&xixi.y==ey ) { ans = min(ans, xixi.time); return; } xixi.time++; if(xixi.time>9) { maze[s][t] = 1; break; } dfs(xixi); maze[s][t] = 1; break; } } for(int j = 1;j<21 ;j++) { // if(check == 1) break; s = xx.x-j; t = xx.y; if(maze[s][t] == 1&&abs(j)==1) break; wode xixi; xixi.time = xx.time; xixi.x=s; xixi.y=t; if(s==ex&&t==ey) { ans = min(ans, xixi.time); break; } if(!(s>=0&&s<h&&t>=0&&t<w)) break; if(s>=0&&s<h&&t>=0&&t<w &&maze[s][t] == 1&&abs(j)!=1) { maze[s][t] = 0; xixi.x+=1; xixi.y-=0; if(xixi.x==ex&&xixi.y==ey ) { ans = min(ans, xixi.time); return; } xixi.time++; if(xixi.time>9) { maze[s][t] = 1; break; } dfs(xixi); maze[s][t] = 1; break; } }}int main(){ while(~scanf("%d%d",&w, &h), w, h) { for(int i = 0; i < h; i++) for(int j = 0; j < w; j++) { scanf("%d", &maze[i][j]); if(maze[i][j] == 2) sx = i,sy = j; else if(maze[i][j]==3) ex = i,ey = j; } wode mimi; mimi.time=0; mimi.x=sx; mimi.y=sy;dir = 0; flag = 0; ans = INT_MAX; dfs(mimi); if(ans > 9) puts("-1"); else printf("%d\n", ans+1); }}
阅读全文
0 0
- POJ 一 3009 Curling 2.0(DFS)
- POJ 3009 Curling 2.0(棋盘DFS)
- poj 3009 Curling 2.0(DFS)
- poj 3009 Curling 2.0(dfs)
- poj 3009 Curling 2.0 (dfs )
- poj 3009 Curling 2.0(dfs)
- POJ 3009-Curling 2.0(DFS)
- POJ 3009 Curling 2.0(DFS)
- POJ 3009 Curling 2.0 (dfs)
- Poj 3009 Curling 2.0 (Dfs)
- POJ 3009 Curling 2.0 (dfs剪枝)
- poj 3009 Curling 2.0(DFS)
- poj 3009 Curling 2.0 (DFS)
- poj 3009 Curling 2.0 (DFS)
- POJ 3009 Curling 2.0(dfs)
- POJ - 3009 Curling 2.0(DFS,模拟)
- POJ 题目3009 Curling 2.0(DFS)
- POJ 3009 Curling 2.0 (DFS)
- 深度学习
- 11.存储空间优化
- 判断一个单项链表中是否有环
- python 报错函数
- Linux中VNC的安装与配置
- POJ 3009 Curling 2.0(dfs)
- java注解的使用
- C++中new/delete以及new[]/delete[]的使用
- MFC 快速为对话框添加右键菜单
- python错误:SyntaxError: Non-ASCII character '\xe4'
- Windows消息:如何自定义窗口消息与线程消息
- 一组常用的Excel日期函数
- 串口通信的基本知识
- HDU-2017"百度之星"程序设计大赛-复赛-补题