+ if (!usage->grid[YUNTRANS(y)*cr+x] &&
+ nsolve_elim(usage, cubepos(x,y,1), 1
+#ifdef STANDALONE_SOLVER
+ , "numeric elimination at (%d,%d)", 1+x,
+ 1+YUNTRANS(y)
+#endif
+ )) {
+ diff = max(diff, DIFF_SIMPLE);
+ goto cont;
+ }
+
+ /*
+ * Intersectional analysis, rows vs blocks.
+ */
+ for (y = 0; y < cr; y++)
+ for (x = 0; x < cr; x += r)
+ for (n = 1; n <= cr; n++)
+ if (!usage->row[y*cr+n-1] &&
+ !usage->blk[((y%r)*c+(x/r))*cr+n-1] &&
+ (nsolve_intersect(usage, cubepos(0,y,n), cr*cr,
+ cubepos(x,y%r,n), r*cr
+#ifdef STANDALONE_SOLVER
+ , "intersectional analysis,"
+ " row %d vs block (%d,%d)",
+ 1+YUNTRANS(y), 1+x/r, 1+y%r
+#endif
+ ) ||
+ nsolve_intersect(usage, cubepos(x,y%r,n), r*cr,
+ cubepos(0,y,n), cr*cr
+#ifdef STANDALONE_SOLVER
+ , "intersectional analysis,"
+ " block (%d,%d) vs row %d",
+ 1+x/r, 1+y%r, 1+YUNTRANS(y)
+#endif
+ ))) {
+ diff = max(diff, DIFF_INTERSECT);
+ goto cont;
+ }
+
+ /*
+ * Intersectional analysis, columns vs blocks.
+ */
+ for (x = 0; x < cr; x++)
+ for (y = 0; y < r; y++)
+ for (n = 1; n <= cr; n++)
+ if (!usage->col[x*cr+n-1] &&
+ !usage->blk[(y*c+(x/r))*cr+n-1] &&
+ (nsolve_intersect(usage, cubepos(x,0,n), cr,
+ cubepos((x/r)*r,y,n), r*cr
+#ifdef STANDALONE_SOLVER
+ , "intersectional analysis,"
+ " column %d vs block (%d,%d)",
+ 1+x, 1+x/r, 1+y
+#endif
+ ) ||
+ nsolve_intersect(usage, cubepos((x/r)*r,y,n), r*cr,
+ cubepos(x,0,n), cr
+#ifdef STANDALONE_SOLVER
+ , "intersectional analysis,"
+ " block (%d,%d) vs column %d",
+ 1+x/r, 1+y, 1+x
+#endif
+ ))) {
+ diff = max(diff, DIFF_INTERSECT);
+ goto cont;
+ }
+
+ /*
+ * Blockwise set elimination.
+ */
+ for (x = 0; x < cr; x += r)
+ for (y = 0; y < r; y++)
+ if (nsolve_set(usage, cubepos(x,y,1), r*cr, 1
+#ifdef STANDALONE_SOLVER
+ , "set elimination, block (%d,%d)", 1+x/r, 1+y
+#endif
+ )) {
+ diff = max(diff, DIFF_SET);
+ goto cont;
+ }
+
+ /*
+ * Row-wise set elimination.
+ */
+ for (y = 0; y < cr; y++)
+ if (nsolve_set(usage, cubepos(0,y,1), cr*cr, 1
+#ifdef STANDALONE_SOLVER
+ , "set elimination, row %d", 1+YUNTRANS(y)
+#endif
+ )) {
+ diff = max(diff, DIFF_SET);
+ goto cont;
+ }
+
+ /*
+ * Column-wise set elimination.
+ */
+ for (x = 0; x < cr; x++)
+ if (nsolve_set(usage, cubepos(x,0,1), cr, 1
+#ifdef STANDALONE_SOLVER
+ , "set elimination, column %d", 1+x
+#endif
+ )) {
+ diff = max(diff, DIFF_SET);
+ goto cont;
+ }