与皇后的凌晨之约(YC)








八皇后问题
终于被调通了,这里列出的算法虽然思维简单,但并不简练,网上可以找到只有其一半代码行数的C解决方案。不过功夫不负有心人,总算是通了,有待换个思维,写个代码简练的C解决方案。
总结经验:
1、不一定非得一开始就想好用什么数据结构,数据结构不一定决定算法,有时可以考虑用算法来决定数据结构,在缺乏 经验的前提下,迂回也许是个好方法。
2、全局变量要慎用,这次就是被注释掉的tmp_point给折腾了(//point_st *tmp_point; ),唯一能作的就是ggst,ddup。代码写他个片甲不留.....................
3、代码的模块性还不强,接口缺乏通用性,关键在于如何组织好函数参数..................


#include <stdlib.h>
#include <stdio.h>
#include <math.h>

typedef struct{
  int x;
  int y;
}point_st;

point_st *p_array[8];//8个皇后位置变量
//point_st *tmp_point;
int y_flag[8];//y轴标志变量
int sum=0;

int cross(int n,point_st *ptemp)
{
  int i;
  //  double slash;
  if(n==-1) return 0;
  for(i=0;i<=n;i++){
    if( abs(p_array[i]->y - ptemp->y) == abs(p_array[i]->x - ptemp->x))
      return 1;
/*     slash =(double)(p_array[i]->y - ptemp->y)/(double)(p_array[i]->x - ptemp->x); */
/*     //针对已经排列的n个皇后,计算新皇后与他们的斜率 */
/*     if(slash==1.0 || slash==-1.0)  //如果斜率=1或=-1说明在一条斜线上 */
    
  }
  return 0;
}


void output(int n_queens)
{
  int i;
  for(i=0;i<n_queens;i++)
    printf("(%d,%d)",p_array[i]->x,p_array[i]->y);
  printf("/n");

}

void queen(int num)
{
  int i;
  point_st *tmp_point;
  tmp_point = (point_st*)malloc(sizeof(point_st));
  if(num ==8){
    sum++;
    output(8);
    return;
  }//设置递归出口,当num=8时,实际上排第9个皇后,此时实际上已排完,则直接打印输出
 
  p_array[num]->x = num;  //x坐标先赋值,
  tmp_point->x = num;
 
  for(i=0;i<=7;i++){   
    tmp_point->y = i;

    if( y_flag[i]==0 && !cross(num-1,tmp_point) ){
      y_flag[i] = 1;
      p_array[num]->y = i;
    
      //如果某一列没被占用,同时与其他已有皇后不在斜线上,设置该列标志,表示该列被占用;
      //并设置第num个皇后的y坐标
      // printf("num = %d ",num);
      // printf("p_array[%d]=(%d,%d)/n",num,p_array[num]->x,p_array[num]->y);
      // if(num==7) printf("/n");  //输出测试用
      // getchar();
      queen(num+1);
      y_flag[i] = 0; //递归返回,取消之前的列标志;
    }  
      
  }

}


int main()
{
  int i;
  for(i=0;i<=7;i++)
    printf("y_flag[%d]=%d/n",i,y_flag[i]);
  for(i=0;i<=7;i++){
    p_array[i] = (point_st *)malloc(sizeof(point_st));
    if(p_array[i] == NULL) exit(EXIT_FAILURE);
  }
 /*  tmp_point = (point_st *)malloc(sizeof(point_st)); */
/*   if(tmp_point == NULL) exit(EXIT_FAILURE);   */

  queen(0);
  printf("sum = %d/n",sum);

  for(i=0;i<=7;i++)
    free(p_array[i]);

/*   free(tmp_point); */

  exit(EXIT_SUCCESS);
}
 

你可能感兴趣的:(与皇后的凌晨之约(YC))