程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 九宮格問題的求解

九宮格問題的求解

編輯:C++入門知識

問題

九宮格問題,要求:

    行列必須為相等的奇數每行數字之和、每列數字之和、兩個對角線數字之和,都相等

    思路說明

    按照下面的方式排列

    橫向為x(從0到n-1),縱向為y方向(從0到n-1)

    1、第一個數放在X方向的中間位置

    2、其它數順次放置各個位置,並依據如下原則:(假設第一個數是a,第二個數是b)

    以a為中心的位置關系分別為:

    左上|上|右上

    左 |a |右

    左下|下|右下

    (1)b放在a的右上位置。a(x,y)-->b(x+1,y-1)

    (2)如果僅有“右”位置超過邊界,即x+1>n,則b(1,y-1)

    (3)如果僅有“上”位置超過邊界,即y-1<0,則b(x+1,n)

    (4)如果“右”“上”位置都超過邊界,即x+1>n,y-1

    (5)如果“右上”已經有值,則b(x,y+1)


    解決(Python)

    #! /usr/bin/env python
    #coding:utf-8
    
    #判斷輸入的九宮格的格數是否為奇數(此處未使用,目的是對所輸入的數進行判斷)
    def if_odd(n):
        if n%2==1:
            return True
        else:
            return False
    
    #九宮格填寫數的法則
    def sudoku_rule(n,sudoku):
    
        tx = n/2
        ty = 0
        for i in range(n*n):
            sudoku[ty][tx] = i+1
            tx = tx+1
            ty = ty-1
            if ty<0 and tx>=n:      #條件(4)
                tx = tx-1
                ty = ty+2
            elif ty<0:              #條件(3)
                ty = n-1
            elif tx>=n:             #條件(2)
                tx = 0
            elif sudoku[ty][tx]!=0: #條件(5)
                tx = tx-1
                ty = ty+2
        return sudoku
    
    if __name__=="__main__":
        n = 5 
        sudoku = [[0 for i in range(n)] for i in range(n)]
        s = sudoku_rule(n,sudoku)
        for line in s:
            print line


    說明:最後打印的結果和輸入的九宮格格數,都可以進一步修改。

    更多算法問題解答,請移步到:https://github.com/qiwsir/algorithm


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved