AtCoderのAGC
次のAGCの問題へ
前のAGCの問題へ
AGC038-A 01 Matrix
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3 3 1 1");
//100
//010
//001
}
else if (InputPattern == "Input2") {
WillReturn.Add("1 5 2 0");
//01010
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(pX => int.Parse(pX)).ToArray();
int H = wkArr[0];
int W = wkArr[1];
int A = wkArr[2];
int B = wkArr[3];
int UB_X = W - 1;
int UB_Y = H - 1;
char[,] BanArr = new char[UB_X + 1, UB_Y + 1];
int ARangeX_Max = A - 1;
int BRangeY_Max = B - 1;
for (int LoopX = 0; LoopX <= UB_X; LoopX++) {
for (int LoopY = 0; LoopY <= UB_Y; LoopY++) {
BanArr[LoopX, LoopY] = '0';
if (ARangeX_Max < LoopX && LoopY <= BRangeY_Max) {
BanArr[LoopX, LoopY] = '1';
}
if (LoopX <= ARangeX_Max && BRangeY_Max < LoopY) {
BanArr[LoopX, LoopY] = '1';
}
}
}
var sb = new System.Text.StringBuilder();
for (int LoopY = 0; LoopY <= UB_Y; LoopY++) {
for (int LoopX = 0; LoopX <= UB_X; LoopX++) {
sb.Append(BanArr[LoopX, LoopY]);
}
sb.AppendLine();
}
Console.Write(sb.ToString());
}
}
解説
オセロセットで、0を白、1を黒として、
8*8で
横計のMin(白の数,黒の数)を5
縦計のMin(白の数,黒の数)を2
で考察します。
1行目は、白の数 <= 黒の数とし、
白と黒をどのように配置しても、一般性を失わないので
○○○○○●●●
で確定できます。
後は、白黒反転させた
●●●●●○○○
との組み合わせで、解が作れます。
解の盤面
○○○○○●●●
○○○○○●●●
●●●●●○○○
●●●●●○○○
●●●●●○○○
●●●●●○○○
●●●●●○○○
●●●●●○○○