题意:
给一个图,1表示石头,2表示出发点,3表示终点,求从2到3的最短步数。
有特殊条件就是在没有遇到1之前,只能一个方向走,遇到1之后1变为零,
然后可以在之前的状态向四个方向走。
思路:
1.dfs重要的是入口和出口的控制条件。
2.想好一个位置的状态以及怎么处理它。
#include<cstdio>
int n,m;
int gragh[30][30];
int sx,sy,ex,ey,ans;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int step)
{
if(step > 10) //控制好入口和出口
return ;
for(int i = 0;i < 4; i++){
int xx = x + dir[i][0];
int yy = y + dir[i][1];
int tx = x,ty = y; //这里很简妙,保留撞到石头的之前位置
while( xx >= 1 && xx <= n && yy >= 1 && yy <= m && gragh[xx][yy] != 1){
tx += dir[i][0];
ty += dir[i][1];
if(xx == ex && yy == ey && step < ans){ //出口条件
ans = step;
return ;
}
xx += dir[i][0]; //在一个方向上连续的走
yy += dir[i][1];
if(xx < 1 || xx > n || yy < 1 || yy > m)
break;
if(gragh[xx][yy] == 1){
gragh[xx][yy] = 0;
dfs(tx,ty,step + 1);
gragh[xx][yy] = 1;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&m,&n) != EOF){
if(n == 0 && m == 0)
break;
for(int i = 1;i <= n; i++){
for(int j = 1;j <= m; j++){
scanf("%d",&gragh[i][j]);
if(gragh[i][j] == 2){
sx = i;
sy = j;
}
else if(gragh[i][j] == 3){
ex = i;
ey = j;
}
}
}
ans = 0x3f3f3f3f;
//gragh[sx][sy] = 0;
dfs(sx,sy,1);
if(ans == 0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
当然也可以这样!
#include<cstdio>
int n,m;
int gragh[30][30];
int sx,sy,ex,ey,ans;
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x,int y,int step)
{
if(step > 10) //控制好入口和出口
return ;
for(int i = 0;i < 4; i++){
int xx = x + dir[i][0];
int yy = y + dir[i][1];
while( xx >= 1 && xx <= n && yy >= 1 && yy <= m && gragh[xx][yy] != 1){
if(xx == ex && yy == ey && step < ans){ //出口条件
ans = step;
return ;
}
xx += dir[i][0]; //在一个方向上连续的走
yy += dir[i][1];
if(xx < 1 || xx > n || yy < 1 || yy > m)
break;
if(gragh[xx][yy] == 1){
gragh[xx][yy] = 0;
dfs(xx-dir[i][0],yy - dir[i][1],step + 1);
gragh[xx][yy] = 1;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&m,&n) != EOF){
if(n == 0 && m == 0)
break;
for(int i = 1;i <= n; i++){
for(int j = 1;j <= m; j++){
scanf("%d",&gragh[i][j]);
if(gragh[i][j] == 2){
sx = i;
sy = j;
}
else if(gragh[i][j] == 3){
ex = i;
ey = j;
}
}
}
ans = 0x3f3f3f3f;
//gragh[sx][sy] = 0;
dfs(sx,sy,1);
if(ans == 0x3f3f3f3f)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}