日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

九宫格C语言递归程序,[置顶] C语言递归实现N宫格(九宫格)源码

發(fā)布時(shí)間:2024/9/19 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 九宫格C语言递归程序,[置顶] C语言递归实现N宫格(九宫格)源码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

剛開(kāi)始做九宮格的時(shí)候,能想到的就是幾個(gè)for循環(huán),很清楚很簡(jiǎn)單,同樣也比較的低級(jí),了解遞歸的魅力后,在高人的指點(diǎn)下,原來(lái)也可以這樣的實(shí)現(xiàn),寫(xiě)到這時(shí),讓我想到了當(dāng)年教我們的老師,thanx,好代碼,我還留著呢,我把當(dāng)年寫(xiě)的源碼分享一下,歡迎拍磚

如果有更好的方法,也可交流一下。。。。。。。

/**************************************************************************************************************

**文件:mian.c

**編寫(xiě)者:huangminqiang

**編寫(xiě)日期:2011年3月12號(hào)

**簡(jiǎn)要描述:遞歸實(shí)現(xiàn)N宮格(九宮格)

**修改者:

**修改日期:

**注:N>5后,運(yùn)行結(jié)果需要的時(shí)間很長(zhǎng),適用于4-9-16宮格。

**************************************************************************************************************/

#include

#define N???4??//每行或列的數(shù)的個(gè)數(shù)

#define MAX???(N*N)?//最大數(shù)

#define ROW_END??1??//行結(jié)束標(biāo)志

#define COL_END??2??//列結(jié)束標(biāo)志

#define LEFT_DOWN?3??//左下角標(biāo)志

#define RIGHT_DOWN?4??//右下角標(biāo)志

#define OTHER??0??//其它情況標(biāo)志

//定義N宮格結(jié)構(gòu)體

struct _ngg

{

int num[MAX];??//定義填數(shù)的數(shù)組

int val;???//判斷相等的值

int count;???//符合條件的組合數(shù)

};

//函數(shù)原型聲明

//初始化結(jié)構(gòu)體變量

void init(struct _ngg *pngg);

//開(kāi)始填數(shù)

void fill(struct _ngg * pngg,int pos);

//獲取標(biāo)志

int getFlag(int pos);

//判斷某個(gè)數(shù)在之前是否已填過(guò),已填過(guò)則返回 1 ,否則返回 0

int isFilled(struct _ngg * pngg,int pos,int i);

//計(jì)算行和

int sumRow(struct _ngg * pngg,int pos);

//計(jì)算列和

int sumCol(struct _ngg * pngg, int pos);

//計(jì)算左上-右下對(duì)角和

int sumLU_RD(struct _ngg * pngg);

//計(jì)算右上-左下對(duì)角和

int sumRU_LD(struct _ngg * pngg);

//打印數(shù)組

void prt(struct _ngg * pngg);

//主函數(shù),初始化并開(kāi)始按位置填數(shù)

int main(void)

{

//變量聲明

struct _ngg ngg = {0};

//初始化結(jié)構(gòu)體變量

init(&ngg);

printf("N = %d, MAX = %d, val = %d\n",N,MAX,ngg.val);

//開(kāi)始填數(shù)

fill(&ngg,0);

return 0;

}

//初始化結(jié)構(gòu)體變量

void init(struct _ngg *pngg)

{

//計(jì)算val的值

pngg->val = MAX * (MAX + 1) / 2 / N;

}

//子函數(shù)實(shí)現(xiàn)填數(shù)

void fill(struct _ngg * pngg,int pos)

{

//聲明變量

int flag = getFlag(pos);??//結(jié)束標(biāo)志

int i;

//從 1 到 MAX 逐個(gè)填入數(shù)組的 pos? 位置

for(i = 1; i <=MAX; i++)

{

//判斷 i 在前面有沒(méi)有填過(guò),填過(guò)則填下一個(gè)數(shù)

if(isFilled(pngg,pos,i))

{

continue;

}

//填入 i 到 pos 位置

pngg->num[pos] = i;

//根據(jù) flag 分情況進(jìn)行處理

switch(flag)

{

//行結(jié)束

case ROW_END:

//如果行和相等則繼續(xù)填下一個(gè)位置

if(pngg->val == sumRow(pngg,pos))

{

fill(pngg,pos+1);

}

break;

//列結(jié)束

case COL_END:

//如果列和相等則繼續(xù)填下一個(gè)位置

if(pngg->val == sumCol(pngg,pos))

{

fill(pngg,pos+1);

}

break;

//左下角

case LEFT_DOWN:

//如果列和、右上-左下對(duì)角和相等則填下一個(gè)位置

if(pngg->val == sumCol(pngg,pos) &&

pngg->val == sumRU_LD(pngg))

{

fill(pngg,pos+1);

}

break;

//右下角

case RIGHT_DOWN:

//如果行和、列和、左上-右下對(duì)角和相等則打印數(shù)組

if(pngg->val == sumRow(pngg,pos) &&

pngg->val == sumCol(pngg,pos) &&

pngg->val == sumLU_RD(pngg) )

{

prt(pngg);

}

break;

//其它情況

//case OTHER:

default:

//其它情況填下一個(gè)位置

fill(pngg,pos+1);

}

}

}

//獲取標(biāo)志

int getFlag(int pos)

{

//如果到了行尾,但不是最后一個(gè)元素則為行結(jié)束

if(0 == (pos + 1) % N && MAX - 1 != pos)

{

return ROW_END;

}

//如果到了列尾,但不是第 0 列,也不是最后一個(gè)元素,則為列結(jié)束

if(pos > N * (N - 1) && MAX - 1 != pos)

{

return COL_END;

}

//如果是最后一行,并且是第 0 列,則為左下角

if(pos == N * (N - 1))

{

return LEFT_DOWN;

}

//如果是最后一個(gè)元素,則是右下角

if(MAX - 1 == pos)

{

return RIGHT_DOWN;

}

//除此之外是其它情況

return OTHER;

}

//判斷某個(gè)數(shù)在之前是否已填過(guò),已填過(guò)則返回 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;

}

//計(jì)算行和

int sumRow(struct _ngg * pngg,int pos)

{

int i,sum = 0;

//從第 pos 個(gè)元素往回加

for(i = pos; i > pos - N; i--)

{

sum += pngg->num[i];

}

return sum;

}

//計(jì)算列和

int sumCol(struct _ngg * pngg, int pos)

{

int i,sum = 0;

//從第 pos 個(gè)元素往上加

for(i = pos; i >= 0; i -= N)

{

sum += pngg->num[i];

}

return sum;

}

//計(jì)算右上-左下對(duì)角和

int sumRU_LD(struct _ngg * pngg)

{

int i,sum = 0;

//從第 N - 1 個(gè)元素開(kāi)始每次跳過(guò) N - 1 個(gè)元素累加

for(i = N - 1; i < MAX -1; i += N - 1)

{

sum += pngg->num[i];

}

return sum;

}

//計(jì)算左上-右下對(duì)角和

int sumLU_RD(struct _ngg * pngg)

{

int i,sum = 0;

//從第 0 個(gè)元素開(kāi)始每次跳過(guò) N + 1個(gè)元素累加

for(i = 0; i < MAX; i += N + 1)

{

sum += pngg->num[i];

}

return sum;

}

//打印數(shù)組

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");

}

}

}

總結(jié)

以上是生活随笔為你收集整理的九宫格C语言递归程序,[置顶] C语言递归实现N宫格(九宫格)源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。