Idea: Record the number of each row in each column that has already appeared. Data is relatively weak
In addition POJ 3074 3076 must use pruning strategies. 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)