Матч
260, Физическая
модель (IsingModel)
Дивизион 2, Уровень
1
Энергетическая характеристика
материи задается прямоугольной сеткой, каждой точке которой поставлен в
соответствие знак ‘+’ или ‘-‘. Энергия материи определяется знаками соседних
ячеек (вертикальных и горизонтальных). Если знаки соседних ячеек одинаковы (два
‘+’ или два ‘-‘), то эта пара знаков вносит в общую энергетическую сумму -1.
Если разные – то +1. Вычислить суммарную энергию материи, энергетическая
характеристика которой задана в двумерном массиве spins.
Класс: IsingModel
Метод: int
energy(vector<string> spins)
Ограничения:
каждый элемент spins содержит от 1 до 50 символов ‘+’ или ‘-‘, все строки
массива spins имеют одинаковую длину.
Вход. Двумерный массив spins, задающий энергетическую
характеристику материи.
Выход. Суммарная энергия материи.
Пример входа
spins |
{"-++", "+-+"} |
{"++-+", "-++-", "+-+-", "++++"} |
{"----", "---+", "-+++", "++++"} |
Пример выхода
3
4
-12
РЕШЕНИЕ
обработка массива
Проходим по ячейкам массива
дважды. Первый раз подсчитываем суммарную энергию материи по горизонталям,
второй – по вертикалям. Значение энергии накапливается в переменной res.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
class IsingModel
{
public:
int energy(vector<string> spins)
{
int i, j, res = 0, m = spins[0].size(),
n = spins.size();
for(i = 0; i < n; i++) for(j = 0; j < m - 1; j++)
if (spins[i][j] == spins[i][j+1]) res--;
else res++;
for(i = 0; i < n - 1; i++) for(j = 0; j < m; j++)
if (spins[i][j] == spins[i+1][j]) res--;
else res++;
return res;
}
};