| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
86行AC代码~~#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Max = 20 + 10;
int map[Max][Max];
int dir[4][2] = {{-1,0},{0,-1},{1,0},{0,1}}; //0上,1左,2下,3右
int flag; //标记是否找到解
int minStep;
int w,h;
void dfs(int x, int y, int step)
{
int nx,ny;
int tx,ty;
int px,py;
if(step > 10)
{
return;
}
if(map[x][y] == 3)
{
minStep = min(minStep, step);
return;
}
for(int i=0; i<4; i++)
{
tx = x + dir[i][0];
ty = y + dir[i][1];
nx = x;
ny = y;
while(tx >= 0 && tx < h && ty >= 0 && ty < w && map[tx][ty] != 1) //预判下一步
{
nx += dir[i][0];
ny += dir[i][1];
if(map[nx][ny] == 3)
{
minStep = min(minStep, step);
return;
}
tx = nx + dir[i][0];
ty = ny + dir[i][1];
if(tx < 0 || tx >= h || ty < 0 || ty >= w) //忘记加这句就会错!!
break; //如果下一个位置越界,就直接break跳出,不进行后面的深搜,越界会直接跳到方向循环中,进行改变方向~
if(map[tx][ty] == 1) //没有越界就要判断是不是遇到墙了,遇到墙就停止滑动,开始进行深搜
{
map[tx][ty] = 0; //消除障碍
dfs(nx, ny, step+1);
map[tx][ty] = 1; //重建障碍
}
}
}
}
int main()
{
int sx,sy;
while(scanf("%d %d",&w,&h) != EOF && w != 0 && h != 0)
{
minStep = 10000;
for(int i=0; i<h; i++)
{
for(int j=0; j<w; j++)
{
scanf("%d",&map[i][j]);
if(map[i][j] == 2) //起点
{
sx = i;
sy = j;
}
}
}
dfs(sx, sy, 1);
if(minStep == 10000)
cout<<"-1"<<endl;
else
cout<<minStep<<endl;
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator