Idea: Record the number of each column in each row that has appeared, the data is relatively weak
In addition POJ 3074 3076 must use pruning strategy, but to achieve more trouble, or after the DLX to do it again
accepted160k0ms#include<cstdio> #include <iostream> #include <algorithm> #include <cstring >using namespace Std;const int N =15;char sudo[n][n];bool visr[n][n],visc[n][n],visg[n][n];int pos[N][N];bool flag; void print () {for (int i=1;i<=9;i++) printf ("%s\n", sudo[i]+1);} void Dfs (int x,int y) {if (y==10) {DFS (x+1,1); return; } if (x==10) {print (); flag=1; return; } if (sudo[x][y]!= ' 0 ') {dfs (x,y+1); return; } for (int i=1;i<=9&&!flag;i++) {if (visr[x][i]==0&&visc[y][i]==0&&visg[pos[x][y]][ i]==0) {sudo[x][y]= ' 0 ' +i; Visc[y][i]=visr[x][i]=visg[pos[x][y]][i]=1; DFS (X,Y+1); sudo[x][y]= ' 0 '; visc[y][i]=visr[x][i]=visg[pos[x][y]][i]=0; }}}void INI () {flag = false; memset (visr,0,sizeof (VISR)); memset (visc,0,sizeof (Visc)); memset (visg,0,sizeof (VISG));} int main () {For (int i=1;i<=9;i++) for (int j=1;j<=9;j++) pos[i][j]= ((j-1)/3+1) +3* ((i-1)/3); int T; scanf ("%d", &t); for (int cas=1;cas<=t;cas++) {printf ("Scenario #%d:\n", CAs); INI (); for (int i=1;i<=9;i++) scanf ("%s", sudo[i]+1); for (int i=1;i<=9;i++) for (int j=1;j<=9;j++) {int val=sudo[i][j]-' 0 '; Visr[i][val]=true; Visc[j][val]=true; Visg[pos[i][j]][val]=true; } dfs (a); Puts (""); } return 0;}
POJ 2676/2918 Sudoku (DFS)