向前走莫回头❤

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




posted @ 2016-10-20 10:28  lris0-0  阅读(76)  评论(0编辑  收藏  举报
过去的终会化为美满的财富~o( =∩ω∩= )m