#include <iostream>
#include <stdio.h>
using namespace std;
int w,h,x1,x2,y1,y2,a[80][80],f[80][80],best,now,
dx[4]={0,0,-1,1},
dy[4]={-1,1,0,0};
void dfs(int xx,int yy,int dd)
{
int i,x,y;
if (now<best&&xx==x2&&yy==y2) { best=now;return;} /*到达终点,记录最小的*/
if (now>best) return;//大于最优跳出
for (i=0;i<=3;i++)
{
x=xx+dx[i]; //四个方向
y=yy+dy[i];
if ((f[x][y]==0&&x<=w+1&&y<=h+1&&x>=0&&y>=0)||(x==x2&&y==y2))//没有走过,没越界
{
f[x][y]=1; //标记走过
if (i!=dd) now++; //改变拐弯次数
dfs(x,y,i);
if (i!=dd) now--; //重置标记
f[x][y]=0;
//若方向不改变,继续走下去,不递归
}
}
}
int main()
{ int i,j,d,k,kk;
char c[80];
// freopen("in.txt","r",stdin);
cin>>h>>w;kk=0;
while (h>0&&w>>0)
{
kk++;
cout<<"Board #"<<kk<<":"<<endl;
k=0;
for (i=0;i<=w+1;i++)
for (j=0;j<=h+1;j++) a[i][j]=0;
getchar();
for (i=1;i<=w;i++)
{
gets(c);
for (j=1;j<=h;j++)
if (c[j-1]=='X') a[i][j]=1;
}
cin>>y1>>x1>>y2>>x2;
while (y1+x1+y2+x2>0)
{
k++;
best=9999999;
now=0;//当前拐弯次数
for (i=0;i<=w+1;i++)
for (j=0;j<=h+1;j++) f[i][j]=a[i][j];
// f[x2][y2]=0;
for (d=0;d<=3;d++) dfs(x1,y1,d);//d表示当前方向
cout<<"Pair "<<k<<": ";
if (best<9999999) cout<<best+1<<" segments."<<endl;else cout<<"impossible."<<endl;
//f[x2][y2]=1;
cin>>y1>>x1>>y2>>x2;
}
cout<<endl;
cin>>h>>w;
}
return 0;
}
以连连看为原型的题目,给定地图和地图上两点,求从第一个点到第二个点最少需要转几次弯。。。
![](https://i-blog.csdnimg.cn/blog_migrate/cbf20980ccb02723a8fc748005dcf855.jpeg)
思路:dfs求最短路径