Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.57 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace osiuzenet
  6. {
  7.     class Program
  8.     {
  9.         private static Dictionary<char,string> hexToBin = new Dictionary<char, string>{
  10.             {'0',"0000"},
  11.             {'1',"0001"},
  12.             {'2',"0010"},
  13.             {'3',"0011"},
  14.             {'4',"0100"},
  15.             {'5',"0101"},
  16.             {'6',"0110"},
  17.             {'7',"0111"},
  18.             {'8',"1000"},
  19.             {'9',"1001"},
  20.             {'a',"1010"},
  21.             {'b',"1011"},
  22.             {'c',"1100"},
  23.             {'d',"1101"},
  24.             {'e',"1110"},
  25.             {'f',"1111"}
  26.         };
  27.         private static Dictionary<int,char> symbolNames = new Dictionary<int, char>{
  28.             {0,'W'},
  29.             {1,'A'},
  30.             {2,'K'},
  31.             {3,'J'},
  32.             {4,'S'},
  33.             {5,'D'},
  34.         };
  35.         private static List<char> symbols;
  36.         private static int[,] matrix;
  37.         private static List<int[]> visited;
  38.         private static Queue<int[]> neighbours;
  39.         private static Queue<int[]> nullList;
  40.         private static int rowNum;
  41.         private static int columnNum;
  42.         static string Decode(string hex){
  43.             StringBuilder s = new StringBuilder();
  44.             foreach(var c in hex){
  45.                 s.Append(hexToBin[c]);
  46.                 //System.Console.WriteLine(hexToBin[c]);
  47.             }
  48.             return s.ToString();
  49.         }
  50.  
  51.         static void ReadMatrix(){
  52.             string s = Console.ReadLine();
  53.             rowNum = int.Parse(s.Split(' ')[0]);
  54.             columnNum = int.Parse(s.Split(' ')[1])*4;
  55.             matrix = new int[rowNum,columnNum];
  56.             for(int i = 0; i<rowNum; i++){
  57.                 string l = Decode(Console.ReadLine());
  58.                 for(int j = 0; j<columnNum; j++){
  59.                     matrix[i,j] = int.Parse(l[j].ToString());
  60.                     //System.Console.Write(matrix[i,j]);
  61.                 }
  62.                 //System.Console.WriteLine();
  63.             }
  64.         }
  65.         static bool Contain(int[] Array){
  66.             bool t = true;
  67.             foreach(var a in neighbours){
  68.                 if(a[0]==Array[0] && a[1]==Array[1]){
  69.                     t = false;
  70.                 }
  71.             }
  72.             foreach(var a in visited){
  73.                 if(a[0]==Array[0] && a[1]==Array[1]){
  74.                     t = false;
  75.                 }
  76.             }
  77.             if(t){
  78.                 return true;
  79.             } else {
  80.                 return false;
  81.             }
  82.         }
  83.         static void DisplayMatrix(){
  84.             for(int i = 0; i<rowNum; i++){
  85.                 for(int j = 0; j<columnNum; j++){
  86.                     System.Console.Write(matrix[i,j]);
  87.                 }
  88.                 System.Console.WriteLine();
  89.             }
  90.         }
  91.         static void SymbolCoordinate(int i, int j, int from){
  92.             int[] coordinateArray = new int[]{i,j};
  93.             if(i<rowNum && i>=0 && j<columnNum && j>=0){
  94.                 if(matrix[i,j]==from && Contain(coordinateArray)){
  95.                     neighbours.Enqueue(new int[]{i,j});
  96.                 }
  97.             }
  98.         }
  99.         static void Symbol(int i, int j, int from, int to){
  100.             int count = 0;
  101.             if(matrix[i,j]==from || matrix[i,j]==0){
  102.                 visited.Add(new int[]{i,j});
  103.                 matrix[i,j] = to;
  104.                 if(matrix[i+1,j]==0){
  105.                     nullList.Enqueue(new int[]{i+1,j});
  106.                 } else
  107.                 if(matrix[i-1,j]==0){
  108.                     nullList.Enqueue(new int[]{i-1,j});
  109.                 } else
  110.                 if(matrix[i,j+1]==0){
  111.                     nullList.Enqueue(new int[]{i,j+1});
  112.                 } else
  113.                 if(matrix[i,j-1]==0){
  114.                     nullList.Enqueue(new int[]{i,j-1});
  115.                 }
  116.                 SymbolCoordinate(i+1,j, from);
  117.                 SymbolCoordinate(i-1,j, from);
  118.                 SymbolCoordinate(i,j+1, from);
  119.                 SymbolCoordinate(i,j-1, from);
  120.             }
  121.             int[] tmp;
  122.             if(neighbours.Count>0){
  123.                 tmp = neighbours.Dequeue();
  124.                 Symbol(tmp[0],tmp[1], from, to);
  125.             } else {
  126.                 foreach(var a in nullList){
  127.                     if(matrix[a[0],a[1]]==0){
  128.                         ProcessMatrix(a[0],a[1],0,3);
  129.                         count++;
  130.                     }
  131.                 }
  132.                 symbols.Add(symbolNames[count]);
  133.             }
  134.         }
  135.         static void ProcessCoordinate(int i, int j, int from){
  136.             int[] coordinateArray = new int[]{i,j};
  137.             if(i<rowNum && i>=0 && j<columnNum && j>=0){
  138.                 if(matrix[i,j]==from && Contain(coordinateArray)){
  139.                     neighbours.Enqueue(new int[]{i,j});
  140.                 }
  141.             }
  142.         }
  143.         static void ProcessMatrix(int i, int j, int from, int to){
  144.             if(matrix[i,j]==from){
  145.                 visited.Add(new int[]{i,j});
  146.                 matrix[i,j] = to;
  147.                 ProcessCoordinate(i+1,j, from);
  148.                 ProcessCoordinate(i-1,j, from);
  149.                 ProcessCoordinate(i,j+1, from);
  150.                 ProcessCoordinate(i,j-1, from);
  151.             }
  152.             int[] tmp;
  153.             if(neighbours.Count>0){
  154.                 tmp = neighbours.Dequeue();
  155.                 ProcessMatrix(tmp[0],tmp[1], from, to);
  156.             }
  157.         }
  158.         static void Main(string[] args)
  159.         {
  160.             nullList = new Queue<int[]>();
  161.             neighbours = new Queue<int[]>();
  162.             visited = new List<int[]>();
  163.             symbols = new List<char>();
  164.             ReadMatrix();
  165.             //DisplayMatrix();
  166.             //System.Console.WriteLine();
  167.             //System.Console.WriteLine();
  168.             for(int i = 0; i<rowNum; i++){
  169.                 for(int j = 0; j<columnNum; j++){
  170.                     if(matrix[i,j]==0){
  171.                         ProcessMatrix(i,j,0,2);
  172.                         goto Break;
  173.                     }
  174.                 }
  175.             }
  176.             Break:;
  177.             //DisplayMatrix();
  178.             for(int i = 0; i<rowNum; i++){
  179.                 for(int j = 0; j<columnNum; j++){
  180.                     if(matrix[i,j]==1){
  181.                         Symbol(i,j,1,5);
  182.                         //DisplayMatrix();
  183.                         //System.Console.WriteLine();
  184.                     }
  185.                 }
  186.             }
  187.             foreach(var a in symbols){
  188.                 System.Console.Write(a);
  189.             }
  190.             System.Console.WriteLine();
  191.         }
  192.     }
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement