




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
問題描述
在本次算法分析的課堂演示中,我做的是一個關(guān)于“裁切悖
論——消失的正方形的PPT”,但是由于代碼的問題,現(xiàn)在借鑒
了同學(xué)的實驗,寫了一個關(guān)于數(shù)獨算法的小題目。
如下圖所示,有一個9*9的正方形,而正方形又分成了九個
小正方形,現(xiàn)在已經(jīng)在圖示的正方形中給出了一些方格中的數(shù)字,
要求將正方形中所有小方格的數(shù)字填充完,并且每個小正方形以
及每行、每列,只能出現(xiàn)一次卜9這九個數(shù)字。
687
9576
48
32
469
4123
5317
892
1763
解決方案
我們先假設(shè)填入的數(shù)字為0~8共9個數(shù)字。
將整個圖分成9個3*3的方塊,從左到右,從上到下,依次編號
0-8。
填每個格子的時候,我們可以選擇.0~8。
對于選擇的數(shù)字,有3種限制,我們通過這三種限制來對回溯過
程進行剪枝。
L行不重復(fù)r[9][9]
2?列不重復(fù)c[9][9]
3?塊不重復(fù)b[9][9]
對使用3個9x9的數(shù)組來描述這三種限制。
對于行n來說,所有之前填過的數(shù)字nums,都有r[n][nums]二
lo
同理,對與列和塊來說,之前每個填過的數(shù)字都相應(yīng)標記為1。
當嘗試向一個格子[row]9。1](塊序號為bi)填充數(shù)據(jù)i(0〈=iv=8,
的時候,如果對應(yīng)中。w][i]=l或c[col][i]=1或b[bi][i]=l,
說明無法滿足條件,是非法的。)
這時再嘗試i=i+L
當向坐標為[row][col]填入一個滿足條件的數(shù)字i的時候,我們
更新限制數(shù)組如下
r[row][i]=1;
c[col][i]=1;
b[bi][i]=1;
然后坐標移到下一個,這里選用的順序是右移動。
對于一個格子CX的后續(xù)CY,如果我們遍歷。?9完成,那么
返回。
嘗試CX的其他可能性。
當填入的格子是[8][8]時,整個問題處理完畢。
對于給定的輸入,直接將初始狀態(tài)的矩陣設(shè)置成相應(yīng)的值,同時,
根據(jù)給定的值,設(shè)置初始的r,c,b的限制條件。
當讀到的格子內(nèi)已經(jīng)有給定值的時候,無需做其他嘗試,直接進
入處理下一個格子。
實際填入的是1?9,所以要對。?8做一點轉(zhuǎn)換。
對于每次嘗試完一個可能填入的數(shù)后,需要恢復(fù)現(xiàn)場,包括將該
格子內(nèi)的數(shù)重置為初始值0.同時,相應(yīng)的限制條件r,c,b都應(yīng)把
剛才填入的值的位置0.
代碼實現(xiàn)
下面給出這道題目的實現(xiàn)代碼:
1.打開codeblocks,新建一個項目;
2.編寫代碼。
代碼如下:
include<stdlib.h>
include<stdio.h>
#defineMMAX9
charM[MMAX][MMAX]={{0}};
intcount=0;
intgetblockid(introw,intcol)
{
returnrow/3*3+col/3;
)
voidgetnext(int*row,int*col,int*nrow,int*ncol){
if(*col==8)
(
*ncol=0;
*nrow=(*row)+1;
)
日se
*nrow=*row;
*ncol=(*col)+1;
)
)
voidoutputmatrix(charmtr[MMAX][MMAX]){
inti,j;
for(i=0;i<MMAX;i++)
(
for(j=0;j<MMAX;j++)
(
printf("%d",mtr[i]OJ);
)
printf("\n");
)
)
voidfill(introw,intcol,charmatrix[MMAX][MMAX],char
rowdOtMMAX],charcold[][MMAX],charblod[][MMAX]){
count++;
if(matrix[row][col]!=0)
if(row==8&&col==8){
outputmatrix(matrix);
return;
)
intnr,nc;
getnext(&row,&col,&nr,&nc);
fill(nr,nc,matrix,rowd,cold,blod);
return;
)
inti=1;
charmtr[MMAX][MMAX];
memcpy(mtr,matrix,MMAX*MMAX*sizeof(char));
for(;i<=9;i++)
(
//duplicatealldata
intblockid=getblockid(row,col);
if(
blod[blockid][i-1]!=(char)1&&
rowd[row][i-1]!=(char)1&&
cold[col][i-1]!=(char)1
)
//fillthecell
//printf("fill[%d][%d]with%d\n",row,col,i);
matrix[row][col]=i;
if(row==8&&col==8){
outputmatrix(matrix);
return;
)
//settherestriction
blod[blockid][i-1]=1;
rowd[row][i-1]=1;
cold[col][i-1]=1;
intnrow.ncol;
getnext(&row,&col,&nrow,&ncol);
fill(nrow,ncol,matrix,rowd,cold,blod);
//restorestatus
blod[blockid][i-1]=0;
rowd[row][i-1]=0;
cold[col][i-1]=0;
matrix[row][col]=0;
)
)
)
voidtrackfixedcell(charfixmtr[MMAX][MMAX],char
r[MMAX][MMAX],charc[MMAX][MMAX],char
b[MMAX][MMAX]){
introw,col;
for(row=0;row<MMAX;row++)
{
for(col=0;col<MMAX;col++)
(
if(fixmtr[row][col]!=0)
(
r[row][(int)fixmtr[row][coI]-1]=1;
c[col][(int)fixmtr[row][col]-1]=1;
b[getblockid(row,col)][(int)fixmtr[row][col]-1]
=1;
)
)
)
)
voidreadfixed(charmtr[MMAX][MMAX],char*input){
inti=0;
for(;i<MMAX*MMAX;i++)
introw=i/MMAX;
intcol=i%MMAX;
if(input[i]!='0')
(
mtr[row][col]=input[i]-48;
)
)
)
/*
*===FUNCTION
*Name:main
*Description:
7
int
main(intargc,char*argv[])
(
char*fixed=
"6000870000009057060400000800300020000040006900004
10023500030170080090200001076300";
charr[MMAX][MMAX]={{0}};
charc[MMAX][MMAX]={{0}};
charb[MMAX][MMAX]={{0}};
readfixed(M,fixed);
trackfixedcell(M,r,c,b);
fill(0,0,M,r,c,b);
printf("count=%d\n",count);
returnEXIT_SUCCESS;
}/*----------endoffunctionmain----------*/
實現(xiàn)圖
S3l^SC:\U$ersVJ'師叔\Desktop\喳\main.exe—□X
659187432
328945716|
147623985
935762841
214358697
876419523
562834179
783591264
491276358
count=24943
Processreturned0(0x0)executiontime:0.065s
Pressanykeytocontinue.
腰狗拼音輸入法全:
出好
心£口
在計算機軟件專業(yè)中,算法分析與設(shè)計是一門非常重要的課
程,很多人為它如癡如醉。很多問題的解決,程序的編寫都要依
賴它,在軟件還是面向過程的階段,就有程序=算法+
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨部門財務(wù)預(yù)算編制與執(zhí)行合同管理規(guī)范
- 書店公益贈書活動方案
- 工人宿舍公物管理制度
- 廣西干部召回管理制度
- 工廠預(yù)制酒店管理制度
- 鐵路樞紐北環(huán)線工程預(yù)應(yīng)力施工作業(yè)指導(dǎo)書
- 先進封裝設(shè)備管理制度
- 公司提供手機管理制度
- 關(guān)于泵房衛(wèi)生管理制度
- 工廠剩菜剩飯管理制度
- 氬弧焊基礎(chǔ)知識培訓(xùn)
- 3.3任務(wù)三小木屋的制作與優(yōu)化 教學(xué)設(shè)計 浙教版初中勞動技術(shù)七年級下冊
- 術(shù)后低蛋白血癥觀察及護理
- 電力營銷安全培訓(xùn)
- 應(yīng)急預(yù)案中的應(yīng)急預(yù)警系統(tǒng)
- 2024新版人教PEP英語(2025春)七年級下冊教學(xué)課件:單元7Unit 7 Section A
- 2025年山西建設(shè)投資集團有限公司招聘筆試參考題庫含答案解析
- 兒童衛(wèi)生知識普及
- 統(tǒng)編版語文四年級上冊21古詩三首《出塞》課件
- 2025屆新高考??碱}選粹:語病修改(附答案解析)
- 譯林版初中英語九年級上冊知識梳理
評論
0/150
提交評論