您的位置:首页 > 其它

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