C 數獨遊戲 遞迴,回溯,驗證是否滿足數獨

2021-06-27 05:07:24 字數 2863 閱讀 4414

你不去做,別人不知道你會做!送給我自己。

題設:在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...