-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathline.cc
100 lines (91 loc) · 2.5 KB
/
line.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include "common.h"
#include "line.h"
// Move the indexed block to the position
bool Line::MoveBlock(int block_index, int where) {
bool result = false;
// Makes sense for scanlines only
if (!workline_) {
if ( clues_[block_index] + where <= len_) {
if (block_positioned_[block_index]){
for(int i = 0; i < clues_[block_index]; i++) {
Clear(block_positions_[block_index]+i);
}
}
for(int i = 0; i < clues_[block_index]; i++) {
Black(where+i);
}
block_positioned_[block_index] = true;
block_positions_[block_index] = where;
result = true;
}
}
return result;
}
// Heuristic value trying to describe line density
int Line::Score ( ) {
int sum = std::accumulate(clues_.begin(), clues_.end(), 0);
int size = clues_.size();
int score = (1 + size)*sum + size*(size - len_) ;
return score;
}
// Clear the given block off the scanline
bool Line::ClearBlock(int block_index) {
for(int i = 0; i < clues_[block_index]; i++) {
Clear(block_positions_[block_index]+i);
}
block_positioned_[block_index] = false;
return true;
}
// First avaiable position, after the last positioned solid block
// the the one necessary white cell
int Line::FirstPos() {
int result = 0;
int last_position = clues_.size() - 1;
for ( int i = clues_.size() - 1 ; !block_positioned_[i] && (i != 0) ; i-- ) {
last_position = i-1;
}
// Compute from the last positioned block,
// 0 is a special case.
if (last_position != 0){
result = block_positions_[last_position] + clues_[last_position] + 1;
}
else {
if ( block_positioned_[0] ) {
result = block_positions_[last_position] + clues_[last_position] + 1;
}
else {
result = 0;
}
}
return result;
}
void Line::DisplayClues(){
for (int i = 0; i < clues_.size(); i++){
std::cout << clues_[i];
std::cout << " ";
}
std::cout << "\n";
}
void Line::InvertWithClues() {
std::reverse(state_.begin(), state_.end());
std::reverse(clues_.begin(), clues_.end());
}
// Text representation for the line - debugging purposes
void Line::DisplayState (){
for (int i = 0; i < len_ ; i++) {
switch (state_[i]) {
case kUnknown:
std::cout << "?";
break;
case kWhite:
std::cout << ".";
break;
case kBlack:
std::cout << "X";
break;
default:
break;
}
}
std::cout << "\n";
}