题意 : 0-3代表四个方向,一共24种映射情况,求一共有几种可以从S到达E
然后有一个神奇的函数,next_permutation(a,a+n); 返回值是bool类型,表示比a序列的下一个序列。
用do-while()循环可以输出包括第一个排列在内的所有的排列。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=123;
char s[N][N],op[N];
int n,m;
int dir[4]={0,1,2,3};
int sx,sy;
int ex,ey;
int Solve()
{
int len=strlen(op);
int x=sx,y=sy;
for(int i=0;i<=len-1;i++)
{
int num=op[i]-'0';
for(int j=0;j<=3;j++)
{
if(num==dir[j])
{
if(j==0)x++;
else if(j==1)x--;
else if(j==2)y++;
else if(j==3)y--;
}
if(x>n||x<1||y>m||y<1)return 0;
else if(s[x][y]=='E')return 1;
else if(s[x][y]=='#')return 0;
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
}
scanf("%s",op);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='S')
{
sx=i;
sy=j;
}
else if(s[i][j]=='E')
{
ex=i;
ey=j;
}
}
}
int ans=0;
do
{
ans+=Solve();
}while(next_permutation(dir,dir+4));
printf("%d\n",ans);
return 0;
}
本文介绍了一个使用next_permutation函数实现的路径探索算法,该算法通过所有可能的方向排列来寻找从起点到终点的有效路径数量。在给定的地图上,通过将方向进行不同的排列组合,并判断每一种排列是否能成功从S走到E。

2万+

被折叠的 条评论
为什么被折叠?



