From 4ddadc7b2196bb719b88d3b40719975f6e783a53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Tue, 15 Jun 2021 21:53:01 +0200
Subject: [PATCH] Check if soduku is solved

---
 android/gradle.properties |  4 +--
 lib/screens/home.dart     | 73 ++++++++++++++++++++++++++++++++++++---
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/android/gradle.properties b/android/gradle.properties
index 14eed39..aa51064 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.4
-app.versionCode=4
+app.versionName=0.0.5
+app.versionCode=5
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 7d399f9..b295f79 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -57,7 +57,7 @@ class Home extends StatelessWidget {
     }
 
     // TODO: shuffle/flip/rotate grid
-    
+
     return cells;
   }
 
@@ -179,7 +179,7 @@ class Home extends StatelessWidget {
     List cells = myProvider.cells;
     int size = myProvider.size;
 
-    Color borderColor = _checkBoardIsSolved(cells) ? Colors.green : Colors.orange;
+    Color borderColor = _checkBoardIsSolved(myProvider) ? Colors.green : Colors.orange;
 
     return Container(
       margin: EdgeInsets.all(2),
@@ -242,8 +242,73 @@ class Home extends StatelessWidget {
     );
   }
 
-  bool _checkBoardIsSolved(List cells) {
-    return false;
+  bool _checkBoardIsSolved(Data myProvider) {
+    List cells = myProvider.cells;
+    int size = myProvider.size;
+
+    // check grid is fully completed
+    for (var row = 0; row < pow(size, 2); row++) {
+      for (var col = 0; col < pow(size, 2); col++) {
+        if (cells[row][col].value == 0) {
+          print('grid not complete');
+          return false;
+        }
+      }
+    }
+    print('ok grid complete complete');
+
+    // check lines does not contains a value twice
+    for (var row = 0; row < pow(size, 2); row++) {
+      List values = [];
+      for (var col = 0; col < pow(size, 2); col++) {
+        values.add(cells[row][col].value);
+      }
+      List distinctValues = values.toSet().toList();
+      if (values.length != distinctValues.length) {
+        print('line ' + row.toString() + ' contains duplicates');
+        return false;
+      }
+    }
+    print('ok no line with duplicates');
+
+    // check columns does not contains a value twice
+    for (var col = 0; col < pow(size, 2); col++) {
+      List values = [];
+      for (var row = 0; row < pow(size, 2); row++) {
+        values.add(cells[row][col].value);
+      }
+      List distinctValues = values.toSet().toList();
+      if (values.length != distinctValues.length) {
+        print('column ' + col.toString() + ' contains duplicates');
+        return false;
+      }
+    }
+    print('ok no column with duplicates');
+
+    // check blocks does not contains a value twice
+    for (var blockRow = 0; blockRow < size; blockRow++) {
+      for (var blockCol = 0; blockCol < size; blockCol++) {
+        List values = [];
+
+        for (var rowInBlock = 0; rowInBlock < size; rowInBlock++) {
+          for (var colInBlock = 0; colInBlock < size; colInBlock++) {
+            int row = (blockRow * size) + rowInBlock;
+            int col = (blockCol * size) + colInBlock;
+            values.add(cells[row][col].value);
+          }
+        }
+
+        List distinctValues = values.toSet().toList();
+        if (values.length != distinctValues.length) {
+          print('block [' + blockCol.toString() + ',' + blockRow.toString() + '] contains duplicates');
+          return false;
+        }
+      }
+    }
+    print('ok no block with duplicates');
+
+    print('-> ok sudoku solved!');
+    return true;
   }
 
   @override
-- 
GitLab