Advertisement
xxeell

Untitled

May 16th, 2018
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.15 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Diagnostics;
  6.  
  7. namespace ForDZ
  8. {  
  9.     class Solution
  10.     {
  11.         enum direct { None = 0, top, right, bottom, left }
  12.  
  13.         struct info
  14.         {
  15.             public int count;
  16.             public direct direction;
  17.         }
  18.  
  19.         private int n, m;
  20.         private List<StringBuilder> a;
  21.         private info check_info;
  22.  
  23.         public Solution(int n, int m, string[] s)
  24.         {
  25.             a = new List<StringBuilder>();
  26.             this.n = n;
  27.             this.m = m;
  28.             for (int i = 0; i < n; i++) a.Add(new StringBuilder(s[i]));
  29.         }
  30.  
  31.         public int Processing()
  32.         {
  33.             int res = 0;
  34.  
  35.             while (can_continue())
  36.             {
  37.                 check_info = check_field();
  38.                 delete();
  39.                 res += (check_info.count * check_info.count);
  40.             }
  41.  
  42.             return res;
  43.         }
  44.  
  45.         private int check_left()
  46.         {
  47.             int c = 0;
  48.             for (int i = 0; i < n; i++) if (a[i][0] == '*') c++;
  49.             return c;
  50.         }
  51.  
  52.         private int check_right()
  53.         {
  54.             int c = 0;
  55.             for (int i = 0; i < n; i++) if (a[i][a[i].Length - 1] == '*') c++;
  56.             return c;
  57.         }
  58.  
  59.         private int check_top()
  60.         {
  61.             int c = 0;
  62.             for (int i = 0; i < a[0].Length; i++) if (a[0][i] == '*') c++;
  63.             return c;
  64.         }
  65.  
  66.         private int check_bottom()
  67.         {
  68.             int c = 0;
  69.             for (int i = 0; i < a[0].Length; i++) if (a[a.Count - 1][i] == '*') c++;
  70.             return c;
  71.         }
  72.  
  73.         private info check_field()
  74.         {
  75.             int score = 0;
  76.             direct dir = direct.None;
  77.             int t;
  78.  
  79.             t = check_top();
  80.             if (t > score)
  81.             {
  82.                 score = t;
  83.                 dir = direct.top;
  84.             }
  85.  
  86.             t = check_left();
  87.             if (t > score)
  88.             {
  89.                 score = t;
  90.                 dir = direct.left;
  91.             }
  92.  
  93.             t = check_bottom();
  94.             if (t > score)
  95.             {
  96.                 score = t;
  97.                 dir = direct.bottom;
  98.             }
  99.  
  100.             t = check_right();
  101.             if (t > score)
  102.             {
  103.                 score = t;
  104.                 dir = direct.right;
  105.             }
  106.  
  107.             info res;
  108.             res.count = score;
  109.             res.direction = dir;
  110.  
  111.             return res;
  112.         }
  113.  
  114.         private bool can_continue()
  115.         {
  116.             foreach (StringBuilder i in a)
  117.             {
  118.                 if (i.Length > 0) return true;
  119.             }
  120.  
  121.             return false;
  122.         }
  123.  
  124.         private void delete_top()
  125.         {
  126.             a.RemoveAt(0);
  127.             n--;
  128.         }
  129.  
  130.         private void delete_bottom()
  131.         {
  132.             a.RemoveAt(a.Count - 1);
  133.             n--;
  134.         }
  135.  
  136.         private void delete_left()
  137.         {
  138.             for (int i = 0; i < n; i++) a[i].Remove(0, 1);
  139.             m--;
  140.         }
  141.  
  142.         private void delete_right()
  143.         {
  144.             for (int i = 0; i < n; i++) a[i].Remove(a[i].Length - 1, 1);
  145.             m--;
  146.         }
  147.  
  148.         private void delete()
  149.         {
  150.             switch (check_info.direction)
  151.             {
  152.                 case direct.None: return;
  153.                 case direct.top: delete_top(); return;
  154.                 case direct.left: delete_left(); return;
  155.                 case direct.bottom: delete_bottom(); return;
  156.                 case direct.right: delete_right(); return;
  157.             }
  158.         }
  159.     }
  160.  
  161.     class Program
  162.     {        
  163.         static void Main(string[] args)
  164.         {
  165.             int[] input = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
  166.  
  167.             string[] s = new string[input[0]];
  168.  
  169.             for (int i = 0; i < input[0]; i++) s[i] = Console.ReadLine();
  170.  
  171.             Solution eto = new Solution(input[0], input[1], s);
  172.  
  173.             Console.WriteLine(eto.Processing());
  174.  
  175.             Console.ReadKey();
  176.            
  177.         }
  178.     }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement