您的位置:首页 > 其它

SWUST OJ 1693 冰壶运动

2016-04-22 22:11 197 查看
给你一个长宽的图,0代表空地,1代表墙,2代表起点,3代表目标点,类似于冰壶运动,每次往一个方向滑动,如果旁边有墙就不能滑动,如果滑动过程中撞到墙,墙就变为0空地,冰壶停在墙的上一个点,就直接DFS暴力搜就是了,注意滑动过程的判断;

#include<stdio.h>
#include<string.h>
int map[30][30],m,n,min;
int dir[4][2]={-1,0,0,-1,1,0,0,1};
void DFS(int x,int y,int step)
{
int dx=x,dy=y;
if(step>10)
return;
if(map[x][y]==3)
{
if(step<min)
min=step;
}
for(int i=0;i<4;i++)
{
dx=x;
dy=y;
int count=0;
step++;
while(dx>=0&&dx<n&&dy>=0&&dy<m)
{

dx=dx+dir[i][0];
dy=dy+dir[i][1];
if(map[dx][dy]==1&&count==0)
break;
count++;
if(dx>=0&&dx<n&&dy>=0&&dy<m)
{
if(map[dx][dy]==3)
{
if(step<min)
min=step;
return;
}
if(map[dx][dy]==1)
{
map[dx][dy]=0;
DFS(dx-dir[i][0],dy-dir[i][1],step);
map[dx][dy]=1;
break;
}
}
}
step--;
}
}
int main()
{
int dx,dy;
while(scanf("%d%d",&m,&n)!=EOF)
{
min=11;
if(m==0&&n==0)
break;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
dx=i;
dy=j;
}
}
}
DFS(dx,dy,0);
if(min==11)
printf("-1\n");
else
printf("%d\n",min);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: