您的位置:首页 > 其它

POJ 3009 Curling 2.0

2011-04-20 23:08 260 查看
#include <stdio.h>
#define MAXN 21
int map[MAXN][MAXN];
int startx, starty;
int w, h, ok, minMove;
int dr[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int legal(int x, int y){
if(x >= 1 && y >= 1 && x <= h && y <= w )
return 1;
return 0;
}
void in(){
int i, j;
for(i = 1; i <= h; ++i){
for(j = 1; j <= w; ++j){
scanf("%d",&map[i][j]);
if(map[i][j] == 2){
startx = i;
starty = j;
map[i][j] = 0;
}
}
}
}
void DFS(int x, int y,int move){
int d,nx,ny;
if(move >= minMove){
return;
}
for(d = 0; d < 4; d++){
nx = x;
ny = y;
while(1){    //要注意的地方
nx += dr[d][0];
ny += dr[d][1];
if( !legal(nx, ny) || map[nx][ny] == 1){
  break;
}
if(map[nx][ny] == 0 && map[nx+dr[d][0]][ny+dr[d][1]] == 1){
map[nx+dr[d][0]][ny+dr[d][1]] = 0;
     DFS(nx,ny,move+1);
map[nx+dr[d][0]][ny+dr[d][1]] = 1;
break;
}
if(map[nx][ny] == 3){
if(move < minMove){
minMove = move;
ok = 1;
break;
}
}
}
}

}
int main(){

int i, j;
while(scanf("%d%d",&w, &h) == 2, w + h){
memset(map, 0, sizeof(map));
in();
ok = 0;
minMove = 11;
DFS(startx, starty,1);
if( ok )
printf("%d\n",minMove);
else
printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: