アイズオンラインジャッジメント(AOJ)のプログラムコード置き場(C#) [ITP1_6]

こんにちは。シジミです。

この記事はAOJで回答したコードを随時置いていきます。

構成としまして、以下のように三弾構成にしています。

・問題:「問題文リンク」
・「説明や注意書き」
・「コード」

環境はvisual sutadio 2019、言語はC#です。

問題:ITP1_6_A

using System;
using System.Collections.Generic;
using System.Linq;

namespace ITP_1_6A
{
   class Program
   {

       static void Main(string[] args)
       {
           int inputs = int.Parse(Console.ReadLine());
           int[] inputs_2 = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
           var call = new Program();

           call.Call(inputs,inputs_2);
           Console.WriteLine("");

           return;
       }
       public void Call(int n,int[] array)
       {
           
           int l = n-1;
           int m = 0;



           for (int i = 0; i < n; i++)
           {

               if(i != 0)Console.Write(" ");

               Console.Write("{0}", array[l]);

               l -= 1;               
           }
       }
   }
}

問題:ITP1_6_B

解説:本来なら二次元配列を用意して解かせる問題ですが、私はCardというオブジェクトを用意してその差分を出力するようにしました。
 注意すべき箇所としては、Exceptメソッドで差分を出す際、

var lst = array_true.Except(array);

 としてしまうと、array,array_trueそれぞれのプロパティが同じでも違うものとして判断されてしまいます。
 なので、IEqualityComparerクラスを継承したクラスを比較用に作成しています。

参考:【C#,LINQ】Except~配列やリストの差集合が欲しいとき~

using System;
using System.Collections.Generic;
using System.Linq;

namespace ITP_1_6A
{
   public class Card
   {
       public string Suit { get; set; }
       public int Number { get; set; }
   }
   public class CardComparer : IEqualityComparer<Card>
   {
       public bool Equals(Card i_lhs, Card i_rhs)
       {
           if (i_lhs.Suit == i_rhs.Suit &&
               i_lhs.Number == i_rhs.Number)
           {
               return true;
           }
           return false;
       }

       public int GetHashCode(Card i_obj)
       {
           // 本当はnullチェックをしなきゃ駄目だよ。
           return i_obj.Number ^ i_obj.Suit.GetHashCode();
       }
   }
   class Program
   {
       static void Main(string[] args)
       {
           var N = System.Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();


           List<Card> array = new List<Card>();
           List<Card> array_true = new List<Card>();

           for (int i = 0; i < N[0]; i++)
           {
               var line = Console.ReadLine().Trim().Split(' ').ToArray();
               array.Add(new Card() { Suit= line[0], Number = int.Parse(line[1]) });

           }
           for (int i = 1; i <= 52; i++)
           {
               if (i <= 13)
               {
                   array_true.Add(new Card() { Suit = "S", Number = i });

               }
               if (i <= 26 && i > 13)
               {
                   array_true.Add(new Card() { Suit = "H", Number = i-13 });


               }
               if (i <= 39 && i > 26)
               {
                   array_true.Add(new Card() { Suit = "C", Number = i -26});


               }
               if (i > 39)
               {
                   array_true.Add(new Card() { Suit = "D", Number = i -39});

               }
           }

           CardComparer comparer = new CardComparer();

           var lst = array_true.Except(array,comparer);

           foreach (var i in lst)
           {
               Console.WriteLine("{0} {1}", i.Suit, i.Number);
           }

           return;
       }

   }
}

問題:ITP1_6_C

解説:三次元配列array_ を0で初期化して作成。これに対して入力のVの部分を各要素に足し上げ、最後に全部書き出すといった流れになっています。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ITP_1_6A
{
   public class Card
   {
       public int B { get; set; }
       public int F { get; set; }
       public int R { get; set; }
       public int V { get; set; }
   }

   class Program
   {
       static void Main(string[] args)
       {
           var N = System.Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();

           List<Card> array = new List<Card>();
           var array_ = new int[4,3,10];

           for (int i = 0; i < N[0]; i++)
           {
               var line = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
               array.Add(new Card() { B= line[0], F = line[1], R = line[2],V =line[3] });
           }

           foreach(var i in array)
           {
               array_[i.B-1,i.F-1,i.R-1] += i.V;
           }

           for(int i = 0; i<4;i++)
           {
               for(int j =0;j<3;j++)
               {
                   for(int k =0;k<10;k++)
                   {
                       Console.Write(" {0}", array_[i, j, k]);
                   }
                   Console.WriteLine();
               }
               if(i != 3)
               {
                   for(int l =0; l<20;l++) Console.Write("#");    
               Console.WriteLine();
               }
           }
           return;
       }
   }
}

問題:ITP1_6_D

解説:連立方程式を解く問題でした。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ITP_1_6A
{

   class Program
   {
       static void Main(string[] args)
       {
           var N = System.Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();

           var array = new int[N[0], N[1]];
           var array_ = new int[N[1]];

           for (int i = 0; i < N[0]; i++)
           {
               var line = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
               for (int j = 0; j < N[1]; j++)
               {
                   array[i, j] = line[j];
               }
           }

           for (int i = 0; i < N[1]; i++)
           {
               var line = Console.ReadLine().Trim().Split(' ').Select(s => int.Parse(s)).ToArray();
               array_[i] = line[0];
           }

           for (int i = 0; i < N[0]; i++)
           {
               int n = 0;
               for (int j = 0; j < N[1]; j++)
               {
                   n += array[i, j] * array_[j];
               }
               Console.WriteLine("{0}", n);
           }
           return;
       }
   }
}

この記事が気に入ったらサポートをしてみませんか?