递归:递归是指某个函数直接或间接的调用自身。问题的求解过程就是划分成许多相同性质的子问题的求解,而小问题的求解过程可以很容易的求出,这些子问题的解就构成里原问题的解。
例如,二分中常用的寻找根节点的递归:
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;
}