惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
B
Blog
博客园 - Franky
I
InfoQ
A
About on SuperTechFans
博客园_首页
L
LangChain Blog
量子位
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
美团技术团队
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
G
Google Developers Blog
Last Week in AI
Last Week in AI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Sudoku Solver | Backtracking
Jaspreet singh · 2026-06-19 · via DEV Community

Jaspreet singh

Problem Statement

Given a partially filled Sudoku board, fill all empty cells so that:

  • Every row contains digits 1-9
  • Every column contains digits 1-9
  • Every 3×3 box contains digits 1-9

Return the solved board.


Brute Force Intuition

For every empty cell:

Try digits 1 to 9

After filling the board:

Check if Sudoku is valid

This leads to enormous possibilities.


Moving Towards the Optimal Approach

Instead of filling everything first:

For every empty cell:

Try digits 1 to 9

Immediately check validity.

If valid:

Place digit
Recurse

Otherwise:

Try next digit


Pattern Recognition

Whenever you see:

  • Fill grid
  • Constraints
  • Multiple choices at each step

Think:

Backtracking + Validation


Key Observation

For an empty cell:

'.'

Try:

1
2
3
...
9

Only continue if placing the digit keeps Sudoku valid.


Optimal Java Solution

class Solution {

    public void solveSudoku(char[][] board) {
        solve(board);
    }

    private boolean solve(char[][] board) {

        for (int row = 0; row < 9; row++) {

            for (int col = 0; col < 9; col++) {

                if (board[row][col] == '.') {

                    for (char ch = '1'; ch <= '9'; ch++) {

                        if (isValid(row, col, ch, board)) {

                            board[row][col] = ch;

                            if (solve(board))
                                return true;

                            board[row][col] = '.';
                        }
                    }

                    return false;
                }
            }
        }

        return true;
    }

    private boolean isValid(int row,
                            int col,
                            char ch,
                            char[][] board) {

        for (int i = 0; i < 9; i++) {

            if (board[row][i] == ch)
                return false;

            if (board[i][col] == ch)
                return false;

            if (board[3 * (row / 3) + i / 3]
                     [3 * (col / 3) + i % 3] == ch)
                return false;
        }

        return true;
    }
}


Dry Run

Find first empty cell:

5 3 .
6 . .
. 9 8

Try:

1 ❌
2 ❌
3 ❌
4 ✅

Place:

5 3 4
6 . .
. 9 8

Move to next empty cell.

Continue until board is solved.


Why Backtracking Works?

For every empty cell:

Try all valid digits

If a digit eventually leads to failure:

Undo
Try next digit

This systematically explores all valid possibilities.


Complexity Analysis

Metric Complexity
Time Complexity O(9^(Empty Cells))
Space Complexity O(81)

Interview One-Liner

For every empty cell, try digits 1-9. If a digit is valid, place it and recursively solve the remaining board. Backtrack whenever a dead end is reached.


Pattern Learned

Fill Grid
+
Validity Constraint
+
Multiple Choices

=> Backtracking

Similar Problems

  • Sudoku Solver
  • N Queens
  • Rat in a Maze
  • Crossword Puzzle
  • Word Search
  • Graph Coloring