1.對於每個空格,根據規則推斷出它可能填入的數字,並存儲其所有可能的值;
2.根據可能值的個數,確定填充順序。比如有的空格只有壹種可能,壹定是正確的結果。先把它們填上。
3.填完所有只有壹種可能的空格後,回到步驟1,重新確定剩余空格的可能值;
4.當可能空間不止壹個(即每個空間有兩個以上的可能性)時,按照可能值個數從小到大的順序,采用深度(廣度)優先搜索來完成剩余空間。
二、套路:
#包含?& ltwindows.h & gt
#包含?& ltstdio.h & gt
#包含?& lttime.h & gt
夏爾?SD[81];
布爾?伊索克?=?假的;
//顯示數獨
作廢?顯示()
{
如果?(isok)?Puts(“解決方案已完成”);
不然呢?Puts("初始化完成");
為了什麽?(int?我?=?0;?我?& lt?81;?i++)
{
putchar(sd[i]?+?'0');
如果?((我?+?1)?%?9?==?0)?putchar(' \ n ');
}
putchar(' \ n ');
}
//讀取數獨
布爾?初始化()
{
文件?*fp?=?fopen("in.txt ",“Rb”);
如果?(fp?==?NULL)?回歸?假的;
fread(sd,81,?1,?FP);
fclose(FP);
為了什麽?(int?我?=?0;?我?& lt?81;?i++)
{
如果?(sd[i]?& gt=?'1'?& amp& amp?sd[i]?& lt=?'9')?sd[i]?-=?'0';
不然呢?sd[i]?=?0;
}
show();
回歸?真實;
}
//遞歸求解數獨
作廢?force(int?k)
{
如果?(isok)?返回;
如果?(!標清[k])
{
為了什麽?(int?m?=?1;?m?& lt=?9;?m++)
{
布爾?嗯?=?真實;
為了什麽?(int?n?=?0;?n?& lt?9;?n++)
{
如果?((m?==?sd[k/27*27+(k%9/3)*3+n+n/3*6])?||?(m?==?sd[9*n+k%9])?||?(m?==?sd[k/9*9+n])
{
嗯?=?假的;
打破;
}
}
如果?(毫米)
{
sd[k]?=?m;
如果?(k?==?80)
{
伊索克?=?真實;
show();
返回;
}
力(k?+?1);
}
}
sd[k]?=?0;
}
其他
{
如果?(k?==?80)
{
伊索克?=?真實;
show();
返回;
}
力(k?+?1);
}
}
int?主()
{
系統(“CLS”);
如果?(Init())
{
雙倍?開始?=?clock();
力(0);
Printf("耗時%.0fms ",時鐘()?-?開始);
}
不然呢?Puts("初始化錯誤");
getchar();
}