В вышеприведенной программе пробелы между элементами массива в tabuleiro.txt
не читаются. Пробел только для чтения при чтении первой строки в
fscanf(fp,"%d %d",&lines,&columns);
Изменение вложенных циклов for
с дополнительным объявлением перед следующим:
char whitespace;
for(i=1;i<=lines;i++){
for(j=1;j<=columns;j++){
fscanf(fp, "%c", &matrix[i][j]);
fscanf(fp, "%c", &whitespace);
printf("%c", matrix[i][j]);
printf("%c", whitespace);
}
}
печатает требуемый результат
X . . X
. O . X
. . O .
Имейте Вас, пытался использовать это:
#include "boost/functional/hash.hpp"
#include <unordered_map>
#include <tuple>
usong Edge = std::tuple<double, double, double, double>;
struct KeyHash {
std::size_t operator()(const Edge & key) const
{
return boost::hash_value(key);
}
};
using EdgeMap = std::unordered_map<Edge, int, KeyHash>;
заметьте, что я использую std
для tuple
и unordered_map
.
Все это есть в документации...
Вам нужно что-то вроде:
std::size_t hash_value(Edge const& e)
{
std::size_t seed = 0;
boost::hash_combine( seed, e.get<0>() );
boost::hash_combine( seed, e.get<1>() );
boost::hash_combine( seed, e.get<2>() );
boost::hash_combine( seed, e.get<3>() );
return seed;
}
... и затем вы можете определить:
boost::unordered_map< Edge, int, boost::hash< Edge > > EdgeMap;
... на самом деле это значение по умолчанию, так что теперь он должен работать без явного определения хеша:
boost::unordered_map< Edge, int > EdgeMap;
Документация Boost дает необходимый интерфейс. Не зная больше о задействованных ценностях, трудно сказать намного больше. Получив в качестве входных данных ключевой объект, он должен создать детерминированный size_t, т. е. это чистая функция, где результат зависит исключительно от входного значения, поэтому ввод одних и тех же входных данных всегда будет производить один и тот же хэш-код.