91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么實現數獨游戲

發布時間:2022-03-24 16:27:46 來源:億速云 閱讀:419 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“C語言怎么實現數獨游戲”,內容詳細,步驟清晰,細節處理妥當,希望這篇“C語言怎么實現數獨游戲”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

目標

寫一個數獨游戲,有以下功能:

1:能隨機產生題目并給出答案。

2:求解輸入的題目并輸出答案。

實現說明

參照百度百科等資料可以知道求解數獨的主要算法是:1.通過行、列和宮格確定可填數字。2.所有可行數字逐一填入得到結果。本程序求解數獨部分也采用這樣的算法。而生成題目的算法是:

隨機產生一個長度為9的一維數組,元素是隨機產生的1到9的不同數字。
比如為root = [1, 4, 3, 5, 6 ,7, 8 ,9, 2].

1、先獲得一個填滿的九宮格accord。
2、假如九宮格accord的第一行為[6, 4, 5, 7, 3, 9, 8, 1, 2], 則可獲得的九宮格squa的第一行第一列元素這樣產生:看accord對應元素為6,則看root中6后一位的數為7,則所求數字為7。以此類推。
3、根據難度隨機去除一定數量的空格則得到了隨機產生的數獨題目。

下面介紹本程序的主要難點和創新點:

1、解數獨的遞歸法。首先要定義一個檢查函數judge用于判斷某個數字在某個位置是否合適,進而根據找到的遞歸頭即至最后一個位置后,分是否為0兩種情況,否則,繼續遞歸。

2、隨機產生1到9之間的數。由于編譯器自帶函數rand會出現元素不變的確點,所以使用系統時間為種子,并引入全局變量index,使得時間差加大,避免固定不變。

3、定義各種函數簡化程序。本程序定義了fprintf用于打印九宮格,定義reRank來獲取元素在數組中位置等,簡化了程序。

結果

下面是分別選擇1(產生題目)和2(計算數獨)后的結果圖:

C語言怎么實現數獨游戲

C語言怎么實現數獨游戲

代碼:

語言: C

//期末實驗報告-簡單的數獨計算器
#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
long index = 0;    //全局變量index是保證每次產生的隨機元素隨機性
void main()
{
    void solve(int squa[9][9], int num); 
    void fprintf(int squa[9][9]);
    int reRank(int root[9], int numb);
    int myRand(int range);
    int squa[9][9], accord[9][9]={   //定義用于生成數獨的參照數組
        {6, 4, 5, 7, 3, 9, 8, 1, 2},
        {2, 1, 8, 6, 4, 5, 9, 7, 3},
        {7, 3, 9, 2, 8, 1, 6, 4, 5},
        {5, 9, 6, 3, 7, 4, 2, 8, 1},
        {4, 8, 7, 5, 1, 2, 3, 6, 9},
        {3, 2, 1, 8, 9, 6, 7, 5, 4},
        {9, 5, 3, 4, 6, 7, 1, 2, 8},
        {8, 7, 2, 1, 5, 3, 4, 9, 6},
        {1, 6, 4, 9, 2, 8, 5, 3, 7}
        };
    int root[9], answ[9][9]; //定義用于生成數組的一維數組和臨時數組
    int i, j, k, p = 0;
    int row;
    int choose, rtemp, diff; //分別定義選擇變量,難度
    char result;
    printf("———請選擇*1*生成一個數獨——*2*計算一個數獨———\n");
    scanf("%d", &choose);
//**************選擇1生成一個填好的數獨****************************
    //根據生成數獨題目算法先存入一個數獨
    if(1 == choose)
    { //產生范圍為1-9的一維數組root
      for(i = 0; i < 9; i++)
      {
          root[i] = myRand(9);
      }
      for(i = 0; i < 9; i++)
      {
            for(j = 0; j < i; j++)
            {
                if(root[i]==root[j]) //使root中元素各不相同
                root[i] = myRand(9);
            }
      }
      //隨機產生完整九宮格
      for(i=0;i<9;i++)
      {
         for(j=0;j<9;j++)
         {
            row = reRank(root,accord[i][j]);
            squa[i][j] = root[(row+1)%9];
         }
      }
      for (i = 0; i < 9; i++)
      {
         for (j = 0; j < 9; j++)
         {
            answ[i][j] = squa[i][j];
         }
      }
      //根據不同難度需求處理數組
      printf("————請選擇難度等級:1(低級)--2(中級)--3(高級)————\n");
      scanf("%d", &diff);
      if(diff==1)               //難度為低級時有30個空格
      {
            for(k=0; k<20;)//; k++)
            {
                 i = myRand(9)-1;
                 j = myRand(9)-1;
                 if(squa[i][j] != 0)
                 {
                  squa[i][j] = 0;
                  k++;
                 }        
            }
      }
      else if(diff==2)          //難度為中級時有50個空格
      {  
            for(k=0; k<30;)
            {
                 i = myRand(9)-1;
                 j = myRand(9)-1;
                 if(squa[i][j] != 0)
                 {
                  squa[i][j] = 0;
                  k++;
                 }        
            }
      }
      else if(diff==3)            //難度為中級時有70個空格
      {
            for(k=0; k<60;)
            {
                 i = myRand(9)-1;
                 j = myRand(9)-1;
                 if(squa[i][j] != 0)
                 {
                  squa[i][j] = 0;
                  k++;
                 }        
            }
      }
      printf("************題目如下(0表示空格)****************\n");
      fprintf(squa);
      printf("——————Enter鍵顯示答案——————");
      fflush(stdin);           //除去緩存影響
      scanf("%c", &result);
      if(result == 10)
          fprintf(answ);
    }
//**************選擇2輸入并計算一個數獨**************************** 
    else
    {
      //*******輸入題目***********************************
      printf("*********請輸入題目(空缺以0代替)**********");
      printf("\n******||1*2*3*4*5*6*7*8*9\n");
      for (i = 0; i < 9; i++)
      {
         printf("******%d:", i + 1);
         for (j = 0; j < 9; j++)
         {
            scanf("%d", &squa[i][j]);
         }
      }
      solve(squa, 0);    //調用函數計算結果
    }
}
 
//定義函數可以產生隨機產生1-9的數
int myRand(int range) 
{
    srand((unsigned)time( NULL ) + index);
    index++;
     return rand()%range + 1;     
}

//定義函數可以在root中根據元素找位置
int reRank(int root[9], int numb)
{    
    int i; 
    for(i = 0; i < 9; i++)
    {
        if(root[i] == numb)
        return i;
    }
}

//解決的第一步:判斷空缺處可填數字的judge函數
int judge(int squa[9][9], int m, int n, int posb)
{
    int num, gridi, gridj;              
    int gi = m / 3 * 3, gj = n / 3 * 3;   //計算元素的宮格位置
    for (num = 0; num < 9; num++)         //根據行元素判斷
    {
        if (squa[m][num] == posb)
            return 0;
    }
    for (num = 0; num < 9; num++)          //根據列元素判斷
    {
        if (squa[num][n] == posb)
            return 0;
    }
    //根據宮格元素判斷
    for (gridi = gi; gridi < gi + 3; gridi++)
    {
        for (gridj = gj; gridj < gj + 3; gridj++)
        {
            if (squa[gridi][gridj] == posb)
                return 0;
        }
    }
    return 1;
}

//定義遞歸函數solve求得一種結果
void solve(int squa[9][9], int num)
{   
    void fprintf(int squa[9][9]);
    int posb;
    int i, j, value;
    int magic[9][9];//定義臨時數組
    int sm,sn;
    sm=num/9;      //計算元素行數
    sn=num%9;      //計算元素列數
    //將squa中元素賦給magic
    for (i = 0; i < 9; i++)
    {
        for (j = 0; j < 9; j++)
        {
            magic[i][j] = squa[i][j];
        }
    }
    //判斷位置處元素非0
    if (magic[sm][sn] != 0)  
    {
        if (sm == 8 && sn == 8) //遞歸頭
        {
            printf("————————參考結果————————\n");
            fprintf(magic);
        }
        else
        {
            solve(magic, num+1);
        }
    }
    else //判斷位置處元素為0
    {
        for (posb = 1; posb <= 9; posb++)
        {   //根據判斷函數返回值決定是否賦值
            value = judge(magic, sm, sn, posb);
            if (value)
            {
                magic[sm][sn] = posb;
                if (sm == 8 && sn == 8) //遞歸頭
                {
                    printf("————————參考結果————————\n");
                    fprintf(magic);    
                }
                else
                {
                    solve(magic, num+1);
                }
                magic[sm][sn] = 0;
            }
        }
    }

}

//打印數組結果函數fprintf的定義
void fprintf(int squa[9][9])
{ 
  int i,j;
  for (i = 0; i < 9; i++)
        {
                for (j = 0; j < 9; j++)
                {   
                     printf("%d ", squa[i][j]);
                    if ((j == 2) || (j == 5)) //換列時加空格
                    printf(" ");
                }
                printf("\n");
                if ((i == 2) || (i == 5))     //換行時加換行符
                {
                    printf("\n");
                }
        }            
}

讀到這里,這篇“C語言怎么實現數獨游戲”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

时尚| 泰来县| 通化市| 南郑县| 湟源县| 外汇| 茌平县| 武冈市| 沂源县| 麻栗坡县| 沁水县| 盐源县| 宁明县| 丹凤县| 大英县| 都江堰市| 信丰县| 蒲江县| 保山市| 明水县| 仁布县| 长海县| 阳朔县| 佳木斯市| 泰兴市| 遂川县| 海林市| 卢湾区| 义乌市| 芮城县| 四平市| 黎平县| 周口市| 开原市| 张家口市| 安西县| 郧西县| 葵青区| 镇康县| 丹东市| 大渡口区|