From 1b04b8248e7d3a14dfe7746f893dfb5a958c4aaf Mon Sep 17 00:00:00 2001 From: Josh Ashton Date: Mon, 11 Mar 2024 14:43:59 -0600 Subject: [PATCH] implemented test for valid sodoku solution. tested the test as well. --- .gitignore | 3 + spring24/week4/Challenge$Stack$Node.class | Bin 764 -> 651 bytes spring24/week4/Challenge$Stack.class | Bin 1400 -> 2216 bytes spring24/week4/Challenge.java | 2 + spring24/week9/Sudoku.class | Bin 4695 -> 5840 bytes spring24/week9/Sudoku.java | 82 ++++++++++++++++++++-- 6 files changed, 81 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e1a2468..085631c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ /Task$CompareByTitle.class /Week9$4.class /Task$SortByTitleComparator.class +.vscode +.classpath +.project \ No newline at end of file diff --git a/spring24/week4/Challenge$Stack$Node.class b/spring24/week4/Challenge$Stack$Node.class index 908f7bad2c07629ca22a489e0af13c79edeab947..244c41ef281d22f99b778e9b76d63e81c4943591 100644 GIT binary patch delta 129 zcmW-Z!4ZNm6hvRbgfW-_M8yU?XrvQ3+muHd!9&JAtim3|85S@5clQ0=**)Ck&Dmq9 z0-mBEV;9)c7_!UtzLG=0k&nrIh90X2sNyYA#us($68onj%TZeX@mEu`{Et>yE2au3 NHoB|R9Cm!$xBw<~55E8a delta 226 zcmYj{u}%U(6h-eq5Euz43dHVZD`Vj%W@+sG11K!V*_UNyc4jg=K|4Rd%J3t078d@E zrC(s-#ERVH&%Wz(ysBfQL%QG zd~gqjn_H5@)rP5LZB$5&S9+@|rYxhRkN+ D^UOG> diff --git a/spring24/week4/Challenge$Stack.class b/spring24/week4/Challenge$Stack.class index 52af3bba9af8cb82a072ca177c9ff7fb3092f227..66d11977434637374c58d828194e5af158f27a23 100644 GIT binary patch literal 2216 zcmd5--A`Oa96ht&z%9^)E)*&3w$$z}w2KH@ON+KhrFNlBAVhrfvW#%sK#%5P56AeELgTyO_wX5EuI^}`%z3$p_C$<)n>D{v=z!sx!iaw8`lSI!u?3wQH! zVNQW6U9}3Cqtwr(iqf3vjo==Et?smpJIcE8Y14@pO*_sj@xr5VnU^!tcAZ2eda*Bz zy#jTb|BY!3^dTt_R&C+t?FjCpVLKJ!0|wf#o$~1;hUDgoMP?++k-}UtCl6Z6Io0JB z+NIJ97>8_I7W?z2<47kAs@u5ULo>OSk*ccB5r_;+#~my0zL@Rym*F5k?x=z_FTNBaHKL-kfeJk5m<3V%p%zPt)=u#9&HlHTPjlu+T# zX_W0mIm9&e%cx6tD7@p$8F)nD<#uctEowWaLe%#nQvZnHY3h1NjH<3aXBoeS)`uFd zU*QYAij8=Utmn!24B0IZ*dlh~EOuiF2k-{^aSn%Z9!GHj58)yv@Rp_&FTpM=lhex3 zeHd4rND(?%qXNEbNQBXvAm5$;2i9*B;U%(uhpgWv>-Wg|eFD2ocps4Uhh+T`S$|B{ zpOE#ZWc?XgfBs)t?}9RjGJhXuWt1vDUE?VP1E>AUE~Pgq+2xB>cB%5TRXX}1)PF@M z?(lM5;+ATpQDuc?RKJd{=`;8?}_IJ^x#MA!4(YPCmg}gnn0;-Mm+)z*rzQa zu3I8{4Lj%wQt4+~m&9>MM-gh)@Lxidj1(Ah;*`p^FaPzc`f(_!)uexGeqpm;Wheed zV80XCRTlqa6@X?BK#*tm>xL|QGQ#@ROg6xjJ{-gYoTFR`4B|n~3fy7NS$#hEH?T*& A_W%F@ literal 1400 zcmb7DU2hUm5Iq+t&=m_}(OPZYQmTs|&={VqF)^e@5<(xSP4w-u+`w&@y_?Kh@B zYSnt5JC1OBqSV&hK1w0MkUQijyy|ebSKaFz3R^QI`hs^Ewwm+HOD)wEJCv@ubjSqq zy7^;3p5Yj#@sfRO8SQ3^SR?1b#D?<+rzJcD}a`XW%y ziRhZP8hFy-S}ND{eARKp;IU~e?)Qb+6}H2D%JHam-VXSk*ZiMN^1d*K|hh`z&K=?HKIPcQv4H>kQ-W_=Q9fhp& zYdSsUF)Ul#BqnzkKryXvU&0t%D7MV0eKa&)#3N@Z%O14)c^nh diff --git a/spring24/week4/Challenge.java b/spring24/week4/Challenge.java index a89aa1c..d04c887 100644 --- a/spring24/week4/Challenge.java +++ b/spring24/week4/Challenge.java @@ -1,3 +1,5 @@ +package spring24.week4; + import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; diff --git a/spring24/week9/Sudoku.class b/spring24/week9/Sudoku.class index 7800c899391f0879177eb36ed81fedd60c846523..ffd0c2611a6674e1800a2ceaf54bde0dafcff0a6 100644 GIT binary patch delta 2836 zcmbtWYj9Op75>&e=brn>$@|e<$m8+|Wg!-GO~OmeLyHkM+Unv%j51t_xN#tK1h zam#(7u~1cHsH%DJ;OI!l$Z$AxV13C>FN)PW(wbXpqYU{1_rc-F;D{dusIXCqDz($K zTx!&Vu9m_Atg=xDi$>i8L(#Aw0-qk%+PEF-)URBdto1fFpg{$U5^Ix<4`H*q%eZ8< z*l0zY3YzWGqN3)yDLgP>8wYX!3mdG%B3sp2&;CFcK4;_e+NBwdJiz3-@Q95s;!#!Y4SFLu zX5-7~RlB@PGEWFnBT?QO>FF367#)cW4XPzZUTjYW40LKlp0e>YP73_cPuuyT4Q}st5h6#a7e)t+6)=zQuZIKZCT4oH%mNqhR+L1kYi4ix#bnqogd3@>ad6 zp4+rhQhOe<`y5u+n*p;tjy3h}fEjSdQ6DfX^t^GJUS05WtcA_75?)jz6E#>&Nf4`0 zjJo}(z-o%tqMp^zh;?Y@Y6sRMiAOdjLZiHiyG(3ijcy@Pf^={P?xgz)6yd{M89bGX zyO2ztG$M^&wvrFxRM?fI9JyP)n^e1W8!gETU11zO^tp{E4bI6-uWSa})!lYYcEXH8 z$Bm2E>_EFZZr>&y>a<-`r=1HArC=xSp;oVUab-}-I-YaAnHsJ0Y2v_~;UNV2d5hbXgfnAh2iHDP~*_76~U z8$7c}@t{jRoSGHALZd zgI5l((r9{+$3CRd^rDco(`fog!!kU~m45-(gtsF^U*lQ|-%SMI^{~--a8x*SskHRP z4WGvNLKdHKI55E@CXcLSm3{Vtztz|{iLCPcvivx{a1oI>zO-%JkbJFGed!xwkMXfJ zn}axx6ZGX{fI3iPAr$(;V>m)99f}{WS=b&ZNu%}S_)3DXuHP^r&BZN7gQgyDtt9R8 zHS5d?mdD&W&G$Sq$mzWN89V{RW5_k8bU$BFz;onD zB4i>!gHsv+&QF+AgxYZW-?M}txI#9)&HZn&48LP1{5_l4+iY}K*wU`D)BFi-xQ0&r z86nR7_zR!)uk`*7d36zA9x9|8~7P!@pBryE-t(w2Hq4C zSHz7!h=pt75wBR1E^b*Qepx0-QZ2UBiXrvll1BC(T{2H0Rlhx3LNa%HHQ%io9X9Fy zROgW0U>DsoCu_s180+W+Gu?qjj@rbd3+l(&cXm12Cl|Dr_z$7!>B42!maZOy7_{T- zv@?m!TBnZO_#?j$6VzG`Y41Sb2HbK3rsSru33&ap@M{jI#;zmJwXkzG+G-X_TCEQi z(EK{`dCJ3E`HPVtJkIiFU1;?rh3S-8Sy_H1xt_#H)7))Lm1{}Qs;A#yo1ODyf5Um> zSmKdaud0ig-l8=BCV6haUNP<`?OHoDn?Na1mU7EOd9&0v{Z!mfO>+oARic<{I z!*61uhIPdz!|i1Iyrf8ypHY94LKnV8761+9wEiAXf8QB@=!|Ea@kh=Wcg7c;aRwK7 OME`947_Zc6J=QD@^ delta 1690 zcmbtVTT@$A7+w3Elbn-q0-*$&NPy6S1OlW`%B_^Dw6$ruwI~$S&;Y00(m)AN#0$38 zs`Wza_EK*Z)QUR1w9ce6piZ6f$p>|O@lD4+;P`4stlvIKQD=N}&dk1idwt(tXMO7= z-&g!tWdG*RwJ!nOi%+lF`&qGu0tRoZF*e1nH(5Vlw78FjMd<+ysTgF)iVF_I)iuG>hB4j{Y%!uy9R^M? zXv4;IcO*JvFv$MWkR2l!Q!&brITo3X1f!AIa4-~`HinHU9pi}d+m>Q2jF^rIOnz2w zontJ-uc`x{FwX0ER+LoYqw|IxVLY$n0$$)g&8LmvB^@v01V5-1>X+!+(Ri28c8F)n zUe?E%ZHM(uyshFbUS}&+Tk#IVWj|lCx%tI3m7ljgre4ArOTB4D7+=#3Ah*58rZClL((KMU#F++YTkjv8eYTBXjPmp1y-gjSz zb4yMFZZYT6ybfRQb!@wVyIV!5G=V@Mfyy?qsZMR$*TH&kpr%prDCG(4YP5J1k0pTy zk5VD#J-kzQEd=326>?FH?br!FYRCh-=&3_9>Tv)KXhS0&q_(FKk>(^FGUI);%cW=$ zTF4@PRAL|YL!!(=%GyuFo8iX&a6qBG69*9@12W+x8db_ZKp06BO()iYH5}r<>ebuY zDVNbh-b&#*2qzQFk%V>dB}X>zad<0|P&zP+OLTcBj--P!LlS$LLVL?+{1*F@Q9$zGHE5~cdjE$@*d~mbT^Ce zD;WjKZ~`a!R~cTONZ+?`=dRAwT^g}Gg(*IMLS>k94)WLvAf z;Wg&``qVT^d^CKB9-{Vv-DdQ8SjAuPTtQ=1ab zZnkSS)h-)Onqn%{z!5x2Y%R#bAQnssbEs89U=?0+uMn7iG|9z6U>k}Nz*DrcZ%Uo4 zHb)H+QkTJY8y;xt0GNt1jD|2{WE)fYKVV_`q`pP^9oa(uvv_**)y|pDSWbDbgg(h< zKDW2Y%`0$~=LPZ-c=6Kc225M;*o|fcQF%k~sC*k*>&5t)Hc}nhbP)s1qhS$(VubJD| e@dnK<+P_O_SIlwA9N))>bRzx?u3`nB!1EWTz9#(u diff --git a/spring24/week9/Sudoku.java b/spring24/week9/Sudoku.java index 2b4ea47..6f5847b 100644 --- a/spring24/week9/Sudoku.java +++ b/spring24/week9/Sudoku.java @@ -44,13 +44,13 @@ public class Sudoku { public static void main(String[] args) { System.out.println("Welcome to the Sudoku Solver!"); - System.out.println("Let's solve a Sudoku puzzle."); Scanner in = new Scanner(System.in); System.out.print("Enter the name of the input file (do not include the file extension): "); String inputFilename = in.nextLine(); System.out.print("Enter the name of the output file (do not include the file extension): "); String outputFilename = in.nextLine(); + in.close(); Sudoku app = new Sudoku(); Cell[][] grid = app.readPuzzle(inputFilename); @@ -65,7 +65,7 @@ public class Sudoku { * @return */ public Cell[][] readPuzzle(String filename) { - System.out.println("TODO: Read sudoku puzzle solution from " + filename); + System.out.println("TODO: Read sudoku puzzle solution from " + filename + ".sdku"); // TODO: Account for possible invalid input file and handle an error. // TODO: Spaces in the file should be represented as '.' in the grid. // TOOD: Read the file's puzzle. @@ -79,7 +79,7 @@ public class Sudoku { * @return */ public void saveSolution(String filename, Cell[][] grid) { - System.out.println("TODO: Write sudoku puzzle solution to " + filename); + System.out.println("TODO: Write sudoku puzzle solution to " + filename + ".sdku"); // TODO: Account for possible invalid solution from isSolved and handle an error. // TODO: Write the solution to the file. } @@ -109,7 +109,7 @@ public class Sudoku { // TODO: Given the rules of Sudoku, solve the puzzle. // HINT: Use the getAvailableNumbers method to find the available numbers for each cell. - // HINT: Use the isSolved method to check if the puzzle is solved. + // HINT: Use the isValidSolution method to check if the puzzle is solved. // HINT: Assume the puzzle is solvable and has only one solution. System.out.println("TODO: Solve the Sudoku puzzle"); } @@ -219,7 +219,77 @@ public class Sudoku { * @param grid a 9x9 grid of numbers * @return true if the grid is a valid Sudoku puzzle, and false otherwise */ - private boolean isSolved(Cell[][] grid) { - return false; // TODO: I need to do this before club. + private boolean isValidSolution(Cell[][] grid) { + // Check that every cell has a value between 1 and 9. + for(int i = 0; i < 9; i++) { + for(int j = 0; j < 9; j++) { + if(grid[i][j].getValue() < 1 || grid[i][j].getValue() > 9) { + System.out.println("Cell at row " + i + " and column " + j + " has an invalid value."); + return false; + } + } + } + + // Check that every row contains the numbers 1-9 exactly once. + for(int i = 0; i < 9; i++) { + int[] row = new int[9]; + for(int j = 0; j < 9; j++) { + row[j] = grid[i][j].getValue(); + } + if(!isValidSet(row)) { + System.out.println("Row " + i + " is invalid."); + return false; + } + } + + // Check that every column contains the numbers 1-9 exactly once. + for(int i = 0; i < 9; i++) { + int[] col = new int[9]; + for(int j = 0; j < 9; j++) { + col[j] = grid[j][i].getValue(); + } + if(!isValidSet(col)) { + System.out.println("Column " + i + " is invalid."); + return false; + } + } + + // Check that every 3x3 subgrid contains the numbers 1-9 exactly once. + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 3; j++) { + int[] box = new int[9]; + for(int k = 0; k < 3; k++) { + for(int l = 0; l < 3; l++) { + box[k * 3 + l] = grid[i * 3 + k][j * 3 + l].getValue(); + } + } + if(!isValidSet(box)) { + System.out.println("Box at row " + i + " and column " + j + " is invalid."); + return false; + } + } + } + + return true; + } + + /** + * Given an array of 9 numbers, return true if the array contains the numbers 1-9 exactly once, and false otherwise. + * + * @param set an array of 9 numbers + * @return true if the array contains the numbers 1-9 exactly once, and false otherwise + */ + private boolean isValidSet(int[] set) { + boolean[] found = new boolean[9]; + for(int i = 0; i < 9; i++) { + if(set[i] < 1 || set[i] > 9) { + return false; + } else if(found[set[i] - 1]) { + return false; + } else { + found[set[i] - 1] = true; + } + } + return true; } } \ No newline at end of file