1
0
Fork 0
Advent2021/Day 4/Marcus/cpp/part1.cpp

92 lines
1.8 KiB
C++
Raw Permalink Normal View History

2021-12-04 20:30:14 +00:00
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct board
{
int nums[25];
friend istream &operator>>( istream &input, board &b ) {
for(int i = 0; i < 25; i++) input >> b.nums[i];
return input;
}
bool marked[25];
};
bool is_winning(board b);
int board_score(board b, int last_drawn);
int main()
{
int drawing[100];
vector<board> boards;
board next_board;
for(int i = 0; i < 100; i++) cin >> drawing[i];
while (cin >> next_board)
{
memset(next_board.marked, false, 25);
boards.push_back(next_board);
}
for(int i = 0; i < 100; i++)
{
for(int j = 0; j < boards.size(); j++)
{
for(int k = 0; k < 25; k++)
{
if (drawing[i] == boards[j].nums[k])
{
boards[j].marked[k] = true;
if (is_winning(boards[j]))
{
cout << board_score(boards[j], drawing[i]) << endl;
return 0;
}
}
}
}
}
return 0;
}
bool is_winning(board b)
{
for(int i = 0; i < 5; i++)
{
if (b.marked[5*i] && b.marked[5*i+1] && b.marked[5*i+2] && b.marked[5*i+3] && b.marked[5*i+4])
{
return true;
}
}
for(int i = 0; i < 5; i++)
{
if (b.marked[i] && b.marked[i+5] && b.marked[i+10] && b.marked[i+15] && b.marked[i+20])
{
return true;
}
}
return false;
}
int board_score(board b, int last_drawn)
{
int sum = 0;
for(int i = 0; i < 25; i++)
{
if (!b.marked[i])
{
sum += b.nums[i];
}
}
return last_drawn*sum;
}