// 思路请点这里
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int board[9][9]; // 棋盘
int RowFlag[9][10]; // RowFlag[i][j]=1 表示 在 第i行 已经放了数字 j
int ColFlag[9][10]; // ColFlag[i][j]=1 表示 在第 i列 已经放了数字 j
int BlockFlag[9][10]; // 同理 第 i 块 已经放了数字 j
struct Node
{
int x, y;
Node( int xx, int yy ) : x(xx), y(yy){}// Q1 结构体中构造函数? 不加分号?
};
vector<Node> BlankPos; //存放所有空白处的位置
inline int GetBlockNum( int a, int b )// Q2 why inline ?
{
return 3*(a/3)+b/3;
}
void SetFlags(int i, int j, int num, int flag )
{
RowFlag[i][num] = ColFlag[j][num] = BlockFlag[GetBlockNum(i, j)][num] = flag;
}
bool IsOk( int i, int j, int num )
{
return !RowFlag[i][num] && !ColFlag[j][num] && !BlockFlag[GetBlockNum(i,j)][num];
}
bool DFS( int n )
{
if( n==BlankPos.size() )
return true;
int r = BlankPos[n].x;
int c = BlankPos[n].y;
for( int i=1; i<10; i++ )
if( IsOk( r, c, i ) ){
board[r][c] = i;
SetFlags( r, c, i, 1 );
if( DFS(n+1) )
return true;
SetFlags( r, c, i, 0 ); // 回溯
}
return false;
}
int main()
{
int T;
cin>>T;
while( T-- )
{
memset( RowFlag, 0, sizeof( RowFlag ) );
memset( ColFlag, 0, sizeof( ColFlag ) );
memset( BlockFlag, 0, sizeof( BlockFlag ) );
BlankPos.clear();
for( int i=0; i<9; i++ )
for( int j=0; j<9; j++ ){
char c;
cin>>c;
board[i][j] = c-'0';
if( board[i][j] )
SetFlags( i, j, board[i][j], 1 );
else
BlankPos.push_back( Node(i, j) );
}
DFS( 0 );
for( int i=0; i<9; i++ ){
for( int j=0; j<9; j++ )
cout<<board[i][j];
cout<<endl;
}
}
return 0;
}