2017-10-29 4 views
0

크기가 n 인 tic-tac-toe "board"가 주어진 보드의 모든 자식을 반환하는 경우 구현을 작성해야합니다. 그러나 각 벡터 내부의 값을 인쇄하지 않기 때문에 그 이유를 모르겠습니다.C++ Vector를 사용하여 Tic-Tac-Toe Tree의 모든 자식 가져 오기

여기에서 우리는 X (1로 표시됨)가 항상 O (-1로 표시됨)보다 먼저 나오는 것으로 가정합니다. 빈 공간은 여기서 0

로서 나타내고있는 헤더 파일의 개인 데이터 멤버로서 vector<int> b_;int n_; 가지고 구현 파일이다 :

#include "tttboard.h" 
#include <vector> 
#include <iostream> 

using namespace std; 

tttboard::tttboard() 
{ 
} 

tttboard::tttboard(int n, vector<int> &e) 
{ 
    n_ = n; 
    for (int i=0; i<n*n; i++) 
    { 
     e.push_back(i); 
    } 
} 

tttboard::tttboard(int n){ 
    n_ = n; 
    for (int i=0; i<n*n; i++) 
     b_.push_back(0); 
} 

vector<tttboard> tttboard::possibleNextBoards(int turn) const{ 
    vector<tttboard> children; 
    int temp; 
    for (int i = 0; i < children.size(); i++) 
    { 
     children.push_back(temp); 
    } 
    return children; 
} 

bool tttboard::operator==(const tttboard& rhs) const 
{ 
    bool check = true; 
    for (int i=0; i < b_.size(); i++) 
    { 
     if (b_[i] == rhs.b_[i]) 
     { 
      continue; 
     } 
     else 
     { 
      check = false; 
      break; 
     } 
    } 
    return check; 
} 

ostream& operator << (ostream & output, const tttboard &board) 
{ 
    output << "{"; 
    for (int i=0; i < board.b_.size(); i++) 
    { 
     output << board.b_[i]; 
     if (i != board.b_.size() - 1) 
      output << ", "; 
    } 
    output << "}"; 
    return output; 
} 

EDIT :이 기본 파일인지 I

#include "tttboard.h" 
#include "gTree.h" 

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

void Tokenize(string line, vector<string> & tokens, string delimiters = "\t "){ 
string token = ""; 
    string OneCharString = " "; 
    for (int i=0; i<line.size(); i++) 
      if (find(delimiters.begin(), delimiters.end(), line[i])!=delimiters.end()) // line[i] is one of the delimiter characters 
      { 
        if (token != "") 
          tokens.push_back(token); 
        token = ""; 
      } 
      else 
      { 
        OneCharString[0] = line[i]; 
        token +=OneCharString; 
      } 

    if (token != "") 
      tokens.push_back(token); 
} 

int getTurn(vector<int> b){ 
    int s = 0; 
    for (int i=0; i<b.size(); i++) 
     s+=b[i]; 
    if (s==0) 
     return 1; 
    else 
     return -1; 
} 

int main(int argc, char** argv){ 
    if (argc!=3){ 
     cout << "usage: executable.o n board\n example of board:(\"{0,0,1,0,0,-1,1,0,0}\")"; 
     return 1; 
    } 

int n= atoi(argv[1]); 
string str_board = argv[2]; 
vector<string> tokens; 
Tokenize(str_board,tokens," {,}"); 
vector<int> board; 
for (int i=0; i<tokens.size(); i++){ 
    board.push_back(atoi(tokens[i].c_str())); 
} 
if (n*n!= board.size()){ 
    cout<< "n and board are not consistent!\n"; 
    return 1; 
} 

    tttboard p(n,board); 
int turn = getTurn(board); 
vector<tttboard> v = p.possibleNextBoards(turn);  

cout <<"children of the given board:" << endl; 
for (int i=0; i<v.size(); i++) 
    cout << v[i] << endl; 

return 0; 

} (이 긴 약간의 경우 사과) 함께 일하고

+0

'메인'의 모양은 무엇입니까? 또한, tttboard :: operator =='는 그렇게 복잡 할 필요는 없습니다. 단지 for (...) {if (b_ [i]! = rhs.b_ [i])가 false를 반환합니다. } return true;'할 것이며,'possibleNextBoards'의 논리는 나에게별로 의미가 없습니다. 그러나 그 중 어느 것도 문제와 관련이 없습니다. – HTNW

+0

@HTNW 위의 주 파일로 편집 됨 – nickoba

답변

2

일 d :: cout은 버퍼링됩니다. std :: endl을 추가하면 출력물이 출력됩니까? cout 라인 다음에 std :: flush를 추가해보십시오. 예를 들어, cout < < .. < < std :: flush;

+0

여전히 공백을 인쇄합니다. – nickoba

+0

이 줄이 인쇄됩니까? cout << "사용법 : executable.o n board \ n 보드 예제 : (\"{0,0,1,0,0, -1,1,0,0} \ ")"- 줄 바꿈없이? –

+0

는 인쇄를합니다. 일부 변경 사항을 반영하도록 코드를 편집했습니다. – nickoba