递归

来源:互联网 发布:qq windows phone 8.1 编辑:程序博客网 时间:2024/06/03 05:32

递归:递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解。 

例如,二分中常用的寻找根节点的递归:

int  find(int x){

return x==per[x]?x:(per[x]=find(per[x]);

}

hdu--red and black

#include<stdio.h>char a[25][25];int count;int w,h;void find(int x,int y){if(a[x][y]=='#')return ;if(x<1||x>h||y<1||y>w)return ;a[x][y]='#';count++;find(x-1,y);find(x+1,y);find(x,y-1);find(x,y+1);}int main(){int i,j,x,y;while(scanf("%d%d",&w,&h),w|h){count = 0;for(i=1;i<=h;i++){getchar();for(j=1;j<=w;j++){scanf("%c",&a[i][j]);if(a[i][j]=='@'){x=i;y=j;}}}        find(x,y);printf("%d\n",count);}return 0;}

hdu---Oil Deposists

#include<stdio.h>#include<string.h>char z[105][105];int m,n;void dsf(int a,int b){int i; if(a<0||a>m-1||b<0||b>n-1||z[a][b]!='@')return ; if(z[a][b]=='@') z[a][b]='*';dsf(a-1,b);dsf(a-1,b-1);dsf(a+1,b+1);dsf(a-1,b+1);dsf(a+1,b-1);dsf(a+1,b);dsf(a,b-1);dsf(a,b+1);}int main(){    int i,a,b,sum,j;while(scanf("%d%d",&m,&n)&&m){getchar();sum=0;memset(z,0,sizeof(z));for(i=0;i<m;i++){gets(z[i]);}for(i=0;i<m;i++)for(j=0;j<n;j++){if(z[i][j]=='@'){sum++;dsf(i,j);}}printf("%d\n",sum);}return 0;}

hdu--N皇后问题

#include<stdio.h>#include<math.h>int n;//n表示几乘机几方格 int k;//k表示第几个皇后 int count;//表示可能的情况 int mark[12];void dsf(int m){int i,j,flag;flag=0;if(m==n+1){count++;return ;}for(i=1;i<=n;i++){       mark[m]=i; //第几个皇后就在第几行 ,mark【】表示皇后的列位置          flag=1;for(j=1;j<m;j++)//将现在皇后的位置与之前几个皇后位置进行对比,若可以则继续找下一个皇后 {if(mark[j]==i||abs(m-j)==abs(i-mark[j]))//i,j既表示第几个皇后也表示第几行 {flag=0;break;}}if(flag)dsf(m+1);}}int main(){int t;int queen[12];for(n=1;n<=10;n++){count = 0;dsf(1);queen[n]=count;}while(scanf("%d",&t)&&t){printf("%d\n",queen[t]);}return 0;}



 

0 0
原创粉丝点击