与皇后的凌晨之约(YC)
来源:互联网 发布:连接wifi成功但没网络 编辑:程序博客网 时间:2024/05/02 04:19
八皇后问题
终于被调通了,这里列出的算法虽然思维简单,但并不简练,网上可以找到只有其一半代码行数的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)
- 关于图像的YC压缩与YC伸张
- 约拿情结与平庸之谬 (转自eastviking的博客)
- 后会有期 再赴与你的“nubia星空之约”
- 一场五年之约的旅途
- 走肾的约炮之旅
- 经验总结 (YC)
- yc
- 腾讯众创空间、YC论道创业:平台与创业者双向选择之术
- YC创业课的总结
- 无约无期的等待(1)
- 无约无期的等待(2)
- 无约无期的等待(3)
- 习羽日记(yc)
- 与阳春约
- 原创:标准之约
- 玫瑰之约
- 七年之约
- Magic Linux开发入门指南(五)
- 再会,北京
- 开始写博客了!
- gridview结合Zedgraph使用用法
- 迭代模式
- 与皇后的凌晨之约(YC)
- 如何将数据导入到 SQL Server Compact Edition 数据库中(五)
- Ajax简介
- 风吹过,云散了,影子淡了
- 上传图片生成略缩图“最佳解决”
- LINQ体验(11)——LINQ to SQL语句之Null语义和String/DateTime方法
- LINQ体验(10)——LINQ to SQL语句之开放式并发控制和事务
- Visual Studio 2008 Express Editions 简体中文版已发布
- ASP.NET常见错误提示