【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;
 } 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值