后端作业

####1.汉诺塔

#include "stdafx.h"
int num=0;
int f(int n)
{
    if(n==1)
      return 1;
    else
      num=2*f(n-1)+1;
    return num;
 }
int main()
{
       scanf("%d",&n);
       f(n);
       printf("num=%dn",num);
       return 0;
} 

####2.整数拆分

#include "stdafx.h"
int sum=1;
int f(int x,int n)
{
    int i;
    if(n==1)
    return 1;
     sum++;
    for(i=1;i<=n/2;i++)
    if(i>=x)
      f(i,n-i);
    return 1;
}
int main(int argc, char* argv[])
{   int n;
    scanf("%d",&n);
    f(0,n);
    printf("sum=%dn",sum);
    return 0;
}

3.四皇后

#include "stdafx.h"
  int a[4][4];
  void f(int x,int y)
  {
    int i,j;
    for(j=0;j<4;j++)
      if(j!=y)
      a[x][j]=1;//将与皇后同行的禁掉
    for(i=0;i<4;i++)
        if(i!=x)
        a[i][y]=1;//将与皇后同列的禁掉
    for(i=1;x-i>=0&&y-i>=0;i++)//主对角线的禁掉
        a[x-i][y-i]=1;
    for(i=1;x+i<4&&y+i<4;i++)
        a[x+i][y+i]=1;
    for(i=1;x-i>=0&&y+i<4;i++)//主对角线的禁掉
                a[x-i][y+1]=1;
    for(i=1;x+i<4&&y-i>=0;i++)
        a[x+i][y-i]=1;
}
 int main(int argc, char* argv[])
 {  
      int row1,row2,row3,row4;
      int i,j,count=0;
      for(row1=0;row1<4;row1++)
       for(row2=0;row2<4;row2++)
        for(row3=0;row3<4;row3++)
           for(row4=0;row4<4;row4++)
            {
               for(i=0;i<4;i++)
                 for(j=0;j<4;j++)
                    a[i][j]=0;
                a[0][row1]=2;//代表可以放皇后
                    f(0,row1);
                if(a[1][row2]==0)
                 {
                     a[1][row2]=2;
                     f(1,row2);
                   if(a[2][row3]==0)
                    { 
                       a[2][row3]=2;
                       f(2,row3);
                       if(a[3][row4]==0)
                        {
                          a[3][row4]=2;
                          count=count+1;
                          printf("%dn",count);
                          return 0;
                        }
                  }
              }
        }
}

####5.N皇后递归实现

#include "stdafx.h"
#include "math.h"
#define N  8
int count;
int x[N]={0};
void queen();
int place(int k)
{
    int j;
    for(j=0;j<k;j++)
    {
    if(abs(k-j)==abs(x[j]-x[k])||x[j]==x[k])
        return 0;
    }
   return 1;
}
void queen(int t)
{
    int i;
    if(t==N)
    count++;
    for(i=0;i<N;i++)
    {
    x[t]=i;
    if(place(t))
    {
      queen(t+1);
    }

}
int main()
{
    int num;
    scanf("%d",&num);
    queen(num);
    printf("count=%dn",count);
    return 0;
}