description: A chess tournament will be held soon, where n chess players will take part. Every participant will play one game against every other participant. Each game ends in either a win for one player and a loss for another player, or a draw for both players.
  
  Each of the players has their own expectations about the tournament, they can be one of two types:
  
    1. a player wants not to lose any game (i. e. finish the tournament with zero losses); 
    2. a player wants to win at least one game. 
  
  
  
  You have to determine if there exists an outcome for all the matches such that all the players meet their expectations. If there are several possible outcomes, print any of them. If there are none, report that it's impossible.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 200) — the number of test cases.
  
  The first line of each test case contains one integer n (2 ≤ n ≤ 50) — the number of chess players.
  
  The second line contains the string s (|s| = n; s_i ∈ \{1, 2\}). If s_i = 1, then the i-th player has expectations of the first type, otherwise of the second type.
  
  Output
  
  For each test case, print the answer in the following format:
  
  In the first line, print NO if it is impossible to meet the expectations of all players.
  
  Otherwise, print YES, and the matrix of size n × n in the next n lines.
  
  The matrix element in the i-th row and j-th column should be equal to:
  
    * +, if the i-th player won in a game against the j-th player; 
    * -, if the i-th player lost in a game against the j-th player; 
    * =, if the i-th and j-th players' game resulted in a draw; 
    * X, if i = j. 
  
  Example
  
  Input
  
  
  3
  3
  111
  2
  21
  4
  2122
  
  
  Output
  
  
  YES
  X==
  =X=
  ==X
  NO
  YES
  X--+
  +X++
  +-X-
  --+X
solution: import java.io.*;
  import java.util.StringTokenizer;
  
  public class ChessTournament {
  
      //Fast Input
      static class FastReader {
          BufferedReader br;
          StringTokenizer st;
  
          public FastReader() {
              br = new BufferedReader(new InputStreamReader(System.in));
          }
  
          String next() {
              while (st == null || !st.hasMoreElements()) {
                  try {
                      st = new StringTokenizer(br.readLine());
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
              return st.nextToken();
          }
  
          int nextInt() {
              return Integer.parseInt(next());
          }
  
          long nextLong() {
              return Long.parseLong(next());
          }
  
          double nextDouble() {
              return Double.parseDouble(next());
          }
  
          String nextLine() {
              String str = "";
              try {
                  str = br.readLine();
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return str;
          }
      }
  
      //Printing an array
      static void print(long[][] a, int r, int c) {
          PrintWriter pw = new PrintWriter(System.out);
          for (int i = 0; i < r; i++) {
              for (int j = 0; j < c; j++) {
                  pw.print(a[i][j] + " ");
              }
              pw.println();
          }
          pw.flush();
      }
  
      //Used to generate random test cases
      //Must be changed according to input format
      static void testCaseGenerator(int t, int lowN, int highN, long lowA, long highA) throws FileNotFoundException {
          File input = new File("C:\\Users\\debar\\OneDrive\\Documents\\input.txt");
          PrintWriter pw = new PrintWriter(input);
          pw.println(t);
          for (int i = 0; i < t; i++) {
              int n = (int) (Math.random() * (highN - lowN)) + lowN;
              pw.println(n);
              for (int j = 0; j < n; j++) {
                  long a = (long) (Math.random() * (highA - lowA)) + lowA;
                  pw.print(a + " ");
              }
              pw.println();
          }
          pw.flush();
      }
  
      //Find factorial of numbers from 1 to n
      //Check the size of factorial array
      static long[] factorial(int n, long mod) {
          long[] factorial = new long[n];
          factorial[0] = 1;
          for (int i = 1; i <= n; i++) {
              factorial[i] = (factorial[i - 1] * i) % mod;
          }
          return factorial;
      }
  
      //Find factorial inverse from 1 to n
      //Check the size of inverse_factorial array
      static long[] factorialInverse(int n, long mod) {
          long[] inverse_factorial = modularInverse(n, mod);
          for (int i = 2; i <= n; i++) {
              inverse_factorial[i] = (inverse_factorial[i] * inverse_factorial[i - 1]) % mod;
          }
          return inverse_factorial;
      }
  
      //Inverse exist when two number are relatively prime
      //Based on Fermat little theorem (a^mod-1)%mod=1 when mod is prime
      //a * a^(mod - 2) % mod = 1
      //a^(mod - 2) % mod =a^-1
      //When mod != prime use Extended euclidean theorem to calculate x and y for equation a*x + mod*y = gcd(a,b)=1
      //(a*x + mod*y = gcd(a,b)=1) % mod = a*x %mod =1
      //https://www.geeksforgeeks.org/find-initial-integral-solution-of-linear-diophantine-equation-if-finite-solution-exists/?ref=rp
      //Used for only one number
      static long modularInverse(long a, long mod) {
          return binaryExponentiation(a, mod - 2, mod);
      }
  
      //Modular inverse for number from 1 to n - 1
      //Time complexity O(n) for n numbers
      //Proof https://cp-algorithms.com/algebra/module-inverse.html
      static long[] modularInverse(int n, long mod) {
          long[] inv = new long[n];
          inv[1] = 1;
          for (int i = 2; i < n; i++) {
              inv[i] = mod - (mod / i) * inv[(int) (mod % i)] % mod;
          }
          return inv;
      }
  
      //GCD calculation of a and b with complexity O(log(Max(a,b))
      static long gcd(long a, long b) {
          long r;
          while (b != 0) {
              r = a % b;
              a = b;
              b = r;
          }
          return a;
      }
  
      //Find prime number upto n with complexity O(n*log(log(n)))
      //Travel through the multiple of prime number and set it to false
      static boolean[] sieveOfEratosthenes(int n) {
  
          boolean[] prime = new boolean[n + 1];
          for (int i = 0; i <= n; i++)
              prime[i] = true;
  
          for (int p = 2; p * p <= n; p++) {
              if (prime[p]) {
                  for (int i = p * p; i <= n; i += p)
                      prime[i] = false;
              }
          }
  
          prime[0] = prime[1] = false;
          return prime;
      }
  
      //Find Prefix sum in O(n)
      static long[] PrefixSum(long[] arr, int n) {
  
          long[] prefixSum = new long[n];
  
          prefixSum[0] = arr[0];
          for (int i = 1; i < n; ++i)
              prefixSum[i] = prefixSum[i - 1] + arr[i];
          return prefixSum;
      }
  
      //Find a^n in O(log n)
      //If n=11 then n in binary is equal to 1011
      //a^n=a^(8+2+1) that is multiply with result when bit is set.
      //https://youtu.be/L-Wzglnm4dM
      static long binaryExponentiation(long a, long n, long mod) {
          long result = 1L;
          n = n % (mod - 1);
          //n = (mod - 1) * floor(n / (mod - 1)) + n % (mod - 1)
          //a^((mod - 1) * floor(n / (mod - 1))) % mod = 1 so a^n % mod =a^(n % (mod - 1)) % mod when mod is prime
          //Using fermat little theorem a^(p-1) % p = 1 when p is prime
          while (n > 0) {
              if ((n & 1) == 1) {
                  result = (result * a) % mod;
              }
              a = (a * a) % mod;
              n /= 2;
          }
          return result;
      }
  
      //Matrix multiplication
      static long[][] matrixMultiply(long[][] a, long[][] b, int row, int col, int mid, long mod) {
          long[][] c = new long[row][col];
          for (int i = 0; i < row; i++) {
              for (int j = 0; j < col; j++) {
                  c[i][j] = 0;
                  for (int k = 0; k < mid; k++) {
                      c[i][j] = (c[i][j] + (a[i][k] * b[k][j]) % mod) % mod;
                  }
              }
          }
          return c;
      }
  
      //Matrix Exponentiation
      static long[][] matrixExponentiation(long[][] a, long n, int size, long mod) {
          if (n == 0) {
              long[][] temp = new long[size][size];
              for (int i = 0; i < size; i++) {
                  temp[i][i] = 1;
              }
              return temp;//Returns identity matrix
          } else {
              long[][] temp = matrixExponentiation(a, n / 2, size, mod);
              if (n % 2 == 0) {
                  return matrixMultiply(temp, temp, size, size, size, mod);
              } else {
                  return matrixMultiply(matrixMultiply(temp, temp, size, size, size, mod), a, size, size, size, mod);
              }
          }
      }
  
      //Solution starts here
      public static void main(String[] args) {
  
          //Input output class reference
          FastReader sc = new FastReader();
          PrintWriter pw = new PrintWriter(System.out);
  
          //Number of test case
          int t = sc.nextInt();
  
          //For each test case
          for (int i = 0; i < t; i++) {
              int n= sc.nextInt();
              String s=sc.nextLine();
              int c1=0,c2=0,g;
              for(int j=0;j<n;j++)
              {
                  if(s.charAt(j)=='1')
                      c1++;
                  if(s.charAt(j)=='2')
                      c2++;
              }
              g=n*(n-1)/2;
              for(int j=1;j<=c1;j++)
              {
                  g-=(n-j);
              }
              if(g<c2)
                  pw.println("NO");
              else
              {
                  char[][] a =new char[n][n];
                  for(int j=0;j<n;j++)
                  {
                      a[j][j]='X';
                      if(s.charAt(j)=='1')
                      {
                          for(int k=0;k<n;k++)
                          {
                              if(j==k)
                                  continue;
                              a[j][k]='=';
                              a[k][j]='=';
                          }
                      }
                  }
                  for(int j=0;j<n;j++)
                  {
                      if(s.charAt(j)=='2')
                      {
                          boolean flag=false;
                         for(int k=j+1;k<n;k++)
                         {
                           if(a[j][k]!='=' && !flag)
                           {
                               flag=true;
                               a[j][k]='+';
                               a[k][j]='-';
                           }
                           else
                           {
                               a[j][k]='-';
                               a[k][j]='+';
                           }
                         }
                      }
                  }
                  pw.println("YES");
                  for(int j=0;j<n;j++)
                  {
                      for(int k=0;k<n;k++)
                      {
                          pw.print(a[j][k]);
                      }
                      pw.println();
                  }
              }
          }
          pw.flush();
      }
      //Solution ends here
  }