全排列,假如有编号为1,2,3的3张扑克牌和编号为1,2,3的三个盒子。现在需要将3张扑克牌分别放在3个盒子里面,并且每个盒子有且只能放一张扑克牌,问题是一共有多少种放法?
如下:
小明拿三张扑克牌走到一号盒子面前,他的心里想1,2,3放哪一个呢?如果要生成全排列,那么都要尝试,于是他先放1,走到2后放下2,最后在3号盒子中放下3,生成排列1,2,3。可是这并没有结束,生成一种排列后,小明需要立即返回,现在小明到了3号盒子面前,取回三号盒子的扑克牌,当小明发现手中只有三号扑克牌的时候,没有其他选择,于是小明不得不再往后退一步,回到2号盒子面前,收回2号盒子中的扑克牌,现在小明有两张扑克牌了,分别是2号和3号,按照之前的规定接下来就是往2号盒子中放下3号扑克牌,往3号盒子中放下2号扑克牌。之后的顺序就是这样,最终每个盒子都能够遍历完所有的扑克牌。
输入:5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3
运行结果: 7
样例说明:输入第一个数n表示迷宫的行,m表示迷宫的列,接下来n行m列为迷宫,0表示空地,1表示障碍物,最后一行四个数前两个表示入口,后两个表示出口,输出最短的步长。
# include <iostream>
# include <string.h>
using namespace std;
int n,m,end_x,end_y,flag=111111;
int a[101][101],b[101][101];
int guiji[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
void find(int x,int y,int step){
if(x==end_x&&y==end_y){
if(step<flag){
flag=step;
}
return ;
}
for(int i=0;i<=3;i++){
int xx=x+guiji[i][0];
int yy=y+guiji[i][1];
if(xx<1||xx>n||yy<1||yy>m)
continue;
if(a[xx][yy]==0){
a[xx][yy]=1;
find(xx,yy,step+1);
a[xx][yy]=0;
}
}
return ;
}
int main(){
memset(b,0,sizeof(b));
freopen("xx.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int begin_x,begin_y;
cin>>begin_x>>begin_y;
cin>>end_x>>end_y;
find(begin_x,begin_y,0);
cout<<flag<<endl;
return 0;
}