Visitors hit counter dreamweaver

poj 3009 DFS

     poj3009

     我觉得很好的一个DFS的题,因为题目出得比较“正常”,说直白了就是很水的题,哈哈。符合我们平时做题的正常思路。就一个DFS就可以完成,总的方向是固定的,就要看你运用的能力了,我们应该学会应变,要把方法用活了,这才是高手的境界!多多磨练吧。加油~!

 

#include <iostream>
#include <fstream>
#include <cstdio>
#include <memory.h>


#define MAX 25
using namespace std;
int map[MAX][MAX];
int start[2],end[2];
int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
int w,h;
int min_times;


void getmap()
{
for(int i=0; i<h; i++)
{
for(int j=0; j<w; j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
start[0]=i;
start[1]=j;
}
}
}
}

void dfs(int x,int y,int step)
{
int sx,sy;
if(step>10) return;
for(int i=0; i<4; i++)
{
if(map[x+dir[i][0]][y+dir[i][1]]!=1)
{
sx=x; sy=y;
while(map[sx+dir[i][0]][sy+dir[i][1]]!=1)
{

sx=sx+dir[i][0]; //不断往前走
sy=sy+dir[i][1];
if(sx<0 || sx>=h || sy<0 || sy>=w) //方向别搞错了。。我开始搞反了 哎。
{
break;
}
if(map[sx][sy]==3)
{
if(min_times>step)
{
min_times=step;
}
return;
}
}//while
if(sx>=0 && sx<h && sy>=0 && sy<w)
{
map[sx+dir[i][0]][sy+dir[i][1]]=0;
dfs(sx,sy,step+1);
map[sx+dir[i][0]][sy+dir[i][1]]=1;
}
}//if
}//for
}

int main()
{
freopen("acm.txt","r",stdin);
while(scanf("%d%d",&w,&h)!=EOF && (w+h)){
memset(map,0,sizeof(map));
min_times=9999;
getmap();
dfs(start[0],start[1],1);
if(min_times==9999)
{
printf("-1\n");
}
else
{
printf("%d\n",min_times);
}
}
return 0;
}

 

posted @ 2012-03-12 11:18  Jason Damon  阅读(289)  评论(0编辑  收藏  举报