Матч 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;

  }

};