poj 3009(Curling 2.0 暴力搜索)
2017-01-07 22:46
417 查看
Problem Link
Curling 2.0题目大意,给你一个大方格,让你从2 搜索到达 3的“最短路径”,这个最短路径是这样定义的,沿用保龄球打法,具体看题目
分析
就是一个暴力搜索题,只需要,在搜索过成中定义号状态并且在继续下搜的时候把状态改回来,#include <iostream> #include <cstdio> #include <vector> #define fi first #define se second using namespace std; typedef long long LL; typedef pair<int,int> PII; int a[25][25]; int m,n; int ans; int dx[] = {1,0,-1,0}; int dy[] = {0,-1,0,1}; void dfs(int x,int y,int dir_x,int dir_y,int step) { if(step>10 ||step >=ans)return; while (1<=x && x<=n && y>=1 && y<=m) { if(a[x][y] == 3){ if(step<ans){ans = step ;break; } }else if(a[x][y] == 1){ a[x][y] = 0; for(int i=0 ; i<4 ; ++i) { int nx = x-dir_x+dx[i],ny = y-dir_y+dy[i]; if(a[nx][ny]!=1){dfs(nx,ny,dx[i],dy[i],step+1);} } a[x][y] = 1; break; }else{ x+=dir_x;y+=dir_y; } } } int main(int argc, char const *argv[]) { PII s,g; while (scanf("%d%d", &m,&n) && m!=0) { ans = 11; for(int i=1 ; i<=n ; ++i) for(int j=1 ; j<=m ; ++j) { scanf("%d",&a[i][j] ); if(a[i][j] == 2){ s.fi = i;s.se = j; } if(a[i][j] == 3){g.fi = i; g.se = j ; } } for(int i=0 ; i<4 ; ++i) if(a[s.fi+dx[i]][s.se+dy[i]]!=1){dfs(s.fi+dx[i],s.se+dy[i],dx[i],dy[i],1);} if(ans>=11)cout<<-1<<endl; else cout<<ans<<endl; } return 0; }
相关文章推荐
- poj_3009_Curling 2.0(搜索)
- poj 3009 Curling2.0 回溯搜索
- POJ-3009 Curling 2.0 解题报告(搜索) 冰壶游戏
- poj3009--Curling 2.0(搜索练习1)
- poj3009 Curling 2.0 DFS搜索
- poj 3009 Curling 2.0-----搜索
- POJ3009 - Curling 2.0 - 深度优先搜索
- poj 3009 Curling 2.0 (dfs)
- poj 3009 Curling 2.0
- POJ 3009 Curling 2.0(DFS)
- poj 3009 Curling 2.0(dfs)
- poj 3009 Curling 2.0 dfs
- POJ3009-Curling 2.0
- poj 3009 Curling 2.0
- POJ 3009 Curling 2.0
- POJ: 3009 Curling 2.0
- poj 3009 Curling 2.0
- POJ 3009 Curling 2.0
- POJ 3009 Curling 2.0
- POJ3009-Curling 2.0