本期題目:5X5方格棋盤難題
在5X5的方格棋盤中(如圖),每行、列、斜線(斜線不僅僅包括對角線)最多可以放兩個球,如何擺放才能放置最多的球,這樣的擺法總共有幾種?輸出所有的擺法。
要求:
用一句SQL實現。
輸出格式:
從方格棋盤第一行至第5行,每行從第一列到第5列依次輸出,0表示不放球,1表示放球。例如:1001000000000000000000000。一行輸出一個行號和一個解,按解所在的列字符串順序從大到小排序。
數據庫平臺:
適用Oracle、MS SQL Sever,版本(Oracle推薦10gr2(包含)以上版本、MS SQL Sever推薦2008版本)
原文見: http://www.itpub.net/thread-1400067-1-1.html
參賽者答案: http://www.itpub.net/thread-1407072-1-1.html
我提交的答案:
解題思路:
1、先將每行可以放2個棋子的排列組合全部列出,用union all生成記錄集。
2、用笛卡爾連接5個表,生成所有行滿足要求的排列組合(第行2個棋子)。
3、去除列和斜邊不滿足要求的記錄。
評委意見:
思路和代碼簡明,結果排序正確,性能良好,寫法直截了當,但未說明最大值=10的依據。既然已經預設了每行各有兩個球,可以推斷每列有且僅有兩個球,下面的列判斷可以改進為=2而不是<=2。
個人分析:
1、每行都肯定有2個棋子的假定是比較武斷的,扣分是應該的,除非自己先用算法或數學方法證明(應該可以證明,但我還不會)。
2、枚舉每行都有2個棋子的代碼比較難看,擴展性不好,可以改進(第二期改進了)。
3、用笛卡爾連接5個表,假如有行數不是5則需要修改SQL,擴展性不好。
4、SQL整體性能不錯,相對其他人的代碼簡單易懂。
5、沒有注釋,主要原因是自己認為代碼邏輯較簡單,評委肯定能看懂,最后還是被扣分了。
由于以上原因最后得分很低,我最喜歡是第3名(TK)的答題,大家有興趣可以看看。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
