【openjudge 计算概论(A)】[函数递归练习(3)]
1:全排列
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char ch[10];
int len,a[10];
bool p[10];
void dfs(int t)
{
if(t>len)
{
for(int i=1;i<=len;++i) printf("%c",ch[a[i]]);
printf("\n");
return;
}
for(int i=1;i<=len;++i)
if(!p[i])
{
p[i]=1; a[t]=i;
dfs(t+1);
p[i]=0; a[t]=0;
}
}
int main()
{
scanf("%s",ch+1);
len=strlen(ch+1);
dfs(1);
return 0;
}
2:分解因数
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,tot,T;
void dfs(int last,int m)
{
if(m==1) {tot++; return;}
for(int i=last;i<=m;++i)
if(!(m%i))
dfs(i,m/i);
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
tot=0;
dfs(2,n);
printf("%d\n",tot);
}
return 0;
}
3:走出迷宫
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char ch[110][110];
int d1[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int n,m,dis[110][110];
int d[10010][2],h,t,tx,ty;
bool p[110][110];
int main()
{
int i,j;
memset(dis,127/3,sizeof(dis));
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
{
getchar();
for(j=1;j<=m;++j)
{
scanf("%c",&ch[i][j]);
if(ch[i][j]=='S') d[++t][0]=i,d[t][1]=j,p[i][j]=1,dis[i][j]=0;
if(ch[i][j]=='T') tx=i,ty=j;
}
}
while(h!=t)
{
h=(h%10010)+1;
int x=d[h][0],y=d[h][1];
if(tx==x&&ty==y) break;
for(int i=0;i<4;++i)
{
int xx=x+d1[i][0],yy=y+d1[i][1];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&ch[xx][yy]!='#')
{
if(dis[xx][yy]>dis[x][y]+1)
{
dis[xx][yy]=dis[x][y]+1;
if(!p[xx][yy])
{
p[xx][yy]=1;
t=(t%10010)+1;
d[t][0]=xx; d[t][1]=yy;
}
}
}
}
}
printf("%d\n",dis[tx][ty]);
return 0;
}
既然无能更改,又何必枉自寻烦忧