九宫格C语言递归程序,[置顶] C语言递归实现N宫格(九宫格)源码
刚开始做九宫格的时候,能想到的就是几个for循环,很清楚很简单,同样也比较的低级,了解递归的魅力后,在高人的指点下,原来也可以这样的实现,写到这时,让我想到了当年教我们的老师,thanx,好代码,我还留着呢,我把当年写的源码分享一下,欢迎拍砖
如果有更好的方法,也可交流一下。。。。。。。
/**************************************************************************************************************
**文件:mian.c
**编写者:huangminqiang
**编写日期:2011年3月12号
**简要描述:递归实现N宫格(九宫格)
**修改者:
**修改日期:
**注:N>5后,运行结果需要的时间很长,适用于4-9-16宫格。
**************************************************************************************************************/
#include
#define N 4 //每行或列的数的个数
#define MAX (N*N) //最大数
#define ROW_END 1 //行结束标志
#define COL_END 2 //列结束标志
#define LEFT_DOWN 3 //左下角标志
#define RIGHT_DOWN 4 //右下角标志
#define OTHER 0 //其它情况标志
//定义N宫格结构体
struct _ngg
{
int num[MAX]; //定义填数的数组
int val; //判断相等的值
int count; //符合条件的组合数
};
//函数原型声明
//初始化结构体变量
void init(struct _ngg *pngg);
//开始填数
void fill(struct _ngg * pngg,int pos);
//获取标志
int getFlag(int pos);
//判断某个数在之前是否已填过,已填过则返回 1 ,否则返回 0
int isFilled(struct _ngg * pngg,int pos,int i);
//计算行和
int sumRow(struct _ngg * pngg,int pos);
//计算列和
int sumCol(struct _ngg * pngg, int pos);
//计算左上-右下对角和
int sumLU_RD(struct _ngg * pngg);
//计算右上-左下对角和
int sumRU_LD(struct _ngg * pngg);
//打印数组
void prt(struct _ngg * pngg);
//主函数,初始化并开始按位置填数
int main(void)
{
//变量声明
struct _ngg ngg = {0};
//初始化结构体变量
init(&ngg);
printf("N = %d, MAX = %d, val = %d\n",N,MAX,ngg.val);
//开始填数
fill(&ngg,0);
return 0;
}
//初始化结构体变量
void init(struct _ngg *pngg)
{
//计算val的值
pngg->val = MAX * (MAX + 1) / 2 / N;
}
//子函数实现填数
void fill(struct _ngg * pngg,int pos)
{
//声明变量
int flag = getFlag(pos); //结束标志
int i;
//从 1 到 MAX 逐个填入数组的 pos 位置
for(i = 1; i <=MAX; i++)
{
//判断 i 在前面有没有填过,填过则填下一个数
if(isFilled(pngg,pos,i))
{
continue;
}
//填入 i 到 pos 位置
pngg->num[pos] = i;
//根据 flag 分情况进行处理
switch(flag)
{
//行结束
case ROW_END:
//如果行和相等则继续填下一个位置
if(pngg->val == sumRow(pngg,pos))
{
fill(pngg,pos+1);
}
break;
//列结束
case COL_END:
//如果列和相等则继续填下一个位置
if(pngg->val == sumCol(pngg,pos))
{
fill(pngg,pos+1);
}
break;
//左下角
case LEFT_DOWN:
//如果列和、右上-左下对角和相等则填下一个位置
if(pngg->val == sumCol(pngg,pos) &&
pngg->val == sumRU_LD(pngg))
{
fill(pngg,pos+1);
}
break;
//右下角
case RIGHT_DOWN:
//如果行和、列和、左上-右下对角和相等则打印数组
if(pngg->val == sumRow(pngg,pos) &&
pngg->val == sumCol(pngg,pos) &&
pngg->val == sumLU_RD(pngg) )
{
prt(pngg);
}
break;
//其它情况
//case OTHER:
default:
//其它情况填下一个位置
fill(pngg,pos+1);
}
}
}
//获取标志
int getFlag(int pos)
{
//如果到了行尾,但不是最后一个元素则为行结束
if(0 == (pos + 1) % N && MAX - 1 != pos)
{
return ROW_END;
}
//如果到了列尾,但不是第 0 列,也不是最后一个元素,则为列结束
if(pos > N * (N - 1) && MAX - 1 != pos)
{
return COL_END;
}
//如果是最后一行,并且是第 0 列,则为左下角
if(pos == N * (N - 1))
{
return LEFT_DOWN;
}
//如果是最后一个元素,则是右下角
if(MAX - 1 == pos)
{
return RIGHT_DOWN;
}
//除此之外是其它情况
return OTHER;
}
//判断某个数在之前是否已填过,已填过则返回 1 ,否则返回 0
int isFilled(struct _ngg * pngg,int pos,int i)
{
int j;
for(j = 0; j < pos;j++)
{
if(pngg->num[j] == i)
{
return 1;
}
}
return 0;
}
//计算行和
int sumRow(struct _ngg * pngg,int pos)
{
int i,sum = 0;
//从第 pos 个元素往回加
for(i = pos; i > pos - N; i--)
{
sum += pngg->num[i];
}
return sum;
}
//计算列和
int sumCol(struct _ngg * pngg, int pos)
{
int i,sum = 0;
//从第 pos 个元素往上加
for(i = pos; i >= 0; i -= N)
{
sum += pngg->num[i];
}
return sum;
}
//计算右上-左下对角和
int sumRU_LD(struct _ngg * pngg)
{
int i,sum = 0;
//从第 N - 1 个元素开始每次跳过 N - 1 个元素累加
for(i = N - 1; i < MAX -1; i += N - 1)
{
sum += pngg->num[i];
}
return sum;
}
//计算左上-右下对角和
int sumLU_RD(struct _ngg * pngg)
{
int i,sum = 0;
//从第 0 个元素开始每次跳过 N + 1个元素累加
for(i = 0; i < MAX; i += N + 1)
{
sum += pngg->num[i];
}
return sum;
}
//打印数组
void prt(struct _ngg * pngg)
{
int i;
printf("-----------------------------------------%d\n",++pngg->count);
for(i = 0; i < MAX; i++)
{
printf("\t%d",pngg->num[i]);
if(0 == (i + 1) % N)
{
printf("\n");
}
}
}
九宫格C语言递归程序,[置顶] C语言递归实现N宫格(九宫格)源码相关推荐
- c语言笔试程序改错题,C语言笔试--程序改错题.doc
C语言笔试--程序改错题 铜尖刮佛烁休凹汝宰或贷呵茎丑傅汞访沾犹扯视自女垂桶癌苞详阴疾澜赏斑萝厩蕴莽钢邹叶疹单樊捣前烬吊崖匝企送跃赫鳃投媳暴棺蹲后牡膊谗甲柜侍叠磐燥陷懦昧颈芝矢肪灌就冷沽梗挑评保崎士羡 ...
- 老男孩GO语言线下培训班1期整套教程(完整18天含源码)
老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │ 01 Go开发1期 day1 ...
- 微信小程序:修复图片音频全新升级带特效喝酒神器源码
这是一款全新升级带特效喝酒神器小游戏微信小程序源码 小编发现很多喝酒神器小程序都不带特效和音效的 感觉差了那么一点意思而且感觉也不炫酷 所以小编今天给大家带来一款带特效,音效炫酷的喝酒神器 该款神器由 ...
- 小程序源码:全网独家小程序版本独立微信社群人脉系统社群空间站最新源码开源+详细教程
功能介绍: 1.微信社群是一个集发布.展示社群信息.人脉推广的裂变工具/平台. 2.通过人脉广场,将商家信息通过名片进行展示,让资源对接.人脉推广更加便捷高效.为平台带来更多流量,让平台更有价值. 3 ...
- 微信小程序仿网易云音乐(使用云开发,提供源码)
微信小程序仿网易云音乐(使用云开发,提供源码)!!!!!!!!!!! 源码: 链接:https://pan.baidu.com/s/1z_ZnRVbT4vjEENimi8yBQQ 提取码:u0o3 一 ...
- 【微信小程序系列】小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet)
[微信小程序系列]小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet) 登录页面 login.wxml <view class="page">< ...
- 时间转秒函数c语言,c语言函数mktime()如何将时间转换成经过的秒数实例源码
c语言函数mktime()如何将时间转换成经过的秒数实例源码. 需要引入的头文件:#include 定义函数:time_t mktime(strcut tm * timeptr); 函数mktime( ...
- 10年大厂程序员是如何高效学习使用redis的丨redis源码分析丨redis存储原理
10年大厂程序员是怎么学习使用redis的 1. redis存储原理分析 2. redis源码学习分享 3. redis跳表和B+树详细对比分析 视频讲解如下,点击观看: 10年大厂程序员是如何高效学 ...
- 2023微信社区小程序+APP+后台,附带超详细完整搭建教程【源码+教程】
2023微信社区小程序+APP+后台,附带超详细完整搭建教程[源码+教程] 微信授权登陆正常,小程序和APP带后台 手机号登陆正常,发帖,建圈子.发活动. 微信小程序是一种轻量级的应用程序,可以在微信 ...
最新文章
- 项目管理生命周期各个阶段的文档
- Android分享中, 过滤指定的应用,已经过滤蓝牙, 并且对不同的分享方式发送不同的内容?...
- jQuery年月日(生日)选择器
- cocoapods的安装(这真是一个神奇的东西,每次安装的方法都不一样,而且很容易出现各种各样的错误)...
- 想做大牛,Java开发的必备技术点你了解了吗?
- Direct3d 显示视频的一个问题
- Android的手势识别
- python中什么是按位取反_js中怎么理解按位取反?
- 传西门子中国运营中近一半业务涉及行贿
- printf(%d,5.01)和printf(%f,5)的输出结果
- python stringvar.get_Python StringVar get函数什么都不返回?
- 华为机试HJ17:坐标移动
- yii2.0 读取user表新增字段问题
- Atitit 函数式编程与命令式编程的区别attilax总结 qbf
- paip.URL跳转漏洞欺骗用户名密码
- 读取SAE J1939协议数据流
- BP神经网络简单代码分析
- 给机器学习面试者的十项建议 | 面试官角度
- Android 图片加载框架Glide主流程源码分析
- VR中姿态、定位和身份识别系统的设计
热门文章
- windows下安装composer抛出Composer\Downloader\TransportException异常解决办法
- 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
- 基于阿里云RDS创建ECS自建从库
- 使用PhantomJS实现网页截图服务
- 年度最期待游戏废土2登陆Linux
- 设计模式系列-组合模式
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
- ASP.NET MVC 获取当前访问域名
- Hibernate 小结
- linux投屏快捷键,Linux基本指令(持续更新中..)