您的位置:首页 > 其它

poj 3009 Curling 2.0

2017-04-17 20:29 411 查看
Curling 2.0


只要步数超过了10||超过了之前已经存在的步数,就可以不用再继续往下找了

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <algorithm>
using namespace std;

int n, m;
int Map[30][30];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
int sx, sy;
int ex, ey;
int flag;
int ans;

void dfs(int x, int y, int step)
{
// printf("step==%d\n", step);
// for(int i = 1;i <= n;i++){
// for(int j = 1;j<=m;j++){
// printf("%d ", Map[i][j]);
// }
// cout << endl;
// }
// printf("X%d Y%d\n", x, y);
// if(flag) return;
if(step>=ans){
return;
}
int F = 0;
for(int i = 0;i < 4;i++){
int xx = x+dx[i];
int yy = y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&Map[xx][yy]!=1){
int xxx = x;
int yyy = y;
F = 0;
while(1){
xxx+=dx[i];
yyy+=dy[i];
// printf("%d %d %d\n", xxx, yyy, Map[xxx][yyy]);
if(xxx<=0||xxx>n||yyy<=0||yyy>m){
F =1;
break;
}
if(Map[xxx][yyy]==0){
continue;
}else if(Map[xxx][yyy]==1){
Map[xxx][yyy] = 0;
xxx-=dx[i];
yyy-=dy[i];
break;
}else if(Map[xxx][yyy]==3){
// printf("%d %d\n", step+1, ans);
if(step+1<ans){
ans = step+1;
flag = 1;
return;
}

}
}
if(F == 1) continue;
dfs(xxx,yyy,step+1);
Map[xxx+dx[i]][yyy+dy[i]] = 1;
}
}
}

int main()
{
while(~scanf("%d %d", &m, &n)){
if(n==0||m==0) break;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
scanf("%d", &Map[i][j]);
if(Map[i][j]==2){
Map[i][j] = 0;
sx = i; sy = j;
}else if(Map[i][j] ==3){
ex = i; ey = j;
}
}
}
flag = 0;
ans = 11;
dfs(sx,sy,0);
if(flag&&ans<=10){
printf("%d\n", ans);
}else{
printf("-1\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: