你不去做,別人不知道你會做!送給我自己。
題設:在9*9的數獨**內輸入幾個數字,自動完成數獨;
準備:在充分理解遞迴,回溯之後,完成這個題目就不難了。但是高效能完成就還是得研究。。。。
原理概要:採用棧的資料結構模型存入已經輸入過得數獨**,此時應該只有幾個**有數字,我們採用乙個標記數字記下這些數字位置,他們是不能進行壓棧和出棧的。然後從第乙個格仔開始遍歷。驗證a[0] 是否為空,則插入1,進行驗證。符合數獨。繼續a[1]插入1,不符合數獨則插入2,符合。繼續a[2]插入1,2,3,等等。直到某個數字插入9也不符合數獨的規則的時候,回溯;
原理詳解:
主函式:
using ch.shudu.musoft.com.cn.models;
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;
using system.runtime.serialization.json;
using ch.shudu.musoft.com.cn.utils;
using system.text;
namespace ch.shudu.musoft.com.cn.controllers
/// /// 進入數獨
///
/// 傳入的json串
///
public string count(string json)
else
else}}
else
else
else
continue;}}
//當前棧如果不正確,回溯。
else
map.pop();
i = map.stack[map.top];}}
}}
//將結果拼接成串 傳回去
stringbuilder resultstr = new stringbuilder();
foreach (int temp in map.stack)
return resultstr.tostring();}}
}
棧類:
using system;
using system.collections.generic;
using system.linq;
using system.web;using system;
using system.collections.generic;
using system.linq;
using system.web;
namespace ch.shudu.musoft.com.cn.models
//儲存標記該格仔是否能被改變
public int tag
//棧指標
public int top;
//建構函式
public map()
/// /// 出棧
///
public int pop()
else
}return stack;
}/// /// 入棧
///
/// 存入的數
///
public int push(int i)
else
}return stack;}}
}
工具類:
using ch.shudu.musoft.com.cn.models;
using system;
using system.collections.generic;
using system.linq;
using system.web;
namespace ch.shudu.musoft.com.cn.utils
return map;
}/// /// 驗證當前數獨是否正確
///
///
///
public static bool isright(int stack)
}if (!isequel(listint))
listint.clear();
}//驗證每列是否正確
for (int j = 0; j < 9; j++)
}if (!isequel(listint))
listint.clear();
}//驗證每個框框內是否正確
for (int i = 0; i < 3; i++)
} }
if (!isequel(listint))
listint.clear();
}//驗證第二排
for (int i = 27; i < 34; i=i+3)}}
if (!isequel(listint))
listint.clear();
}//驗證第三排
for (int i = 54; i < 61; i = i + 3)}}
if (!isequel(listint))
listint.clear();
}return true;
}/// /// 判斷該陣列集合類是否存在相同的數
///
///
///
public static bool isequel(listlist)
else
else
}return map;}}
}
數獨 深搜 剪枝 遞迴 回溯
數獨是乙個我們都非常熟悉的經典遊戲,運用計算機我們可以很快地解開數獨難題,現在有一些簡單的數獨題目,請編寫乙個程式求解。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的。輸出描述 輸出九行,每行九個空格隔開的數字,為解出的答案。思路 深搜 剪枝 遞迴 回溯凡是類似於迷宮的尋找路...
數獨遊戲(sudoku)演算法 回溯 剪枝
具體數獨遊戲是什麼,我就不介紹了,好像多餘了,你能來看這篇文章,說明你對數獨遊戲已經有了相當的了解了!還是入正題吧,今天先講解和發下用回溯 剪枝 求數獨遊戲,我也看了些回溯 剪枝求數獨的演算法,很惱火,既沒注釋,而且演算法沒有通用性。今天我給大家講的回溯 剪枝法,不僅可以用於解決數獨問題,而且還可以...
C 解決數獨問題(回溯)
參考鏈結來自於 輸入乙個數獨作為9 9的陣列,例如輸入乙個測試資料map 9 9 為 0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0...