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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 九宫格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宫格(九宫格)源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。