예제 #1
0
	bool canWin(vector<int>& data, vector<bool>& visited, int index) {
		if (index<0 || index>=data.size()) return false;
		if (visited[index]==true) return false;
		if (data[index]==0) return true;

		visited[index]=true;
		int newIdx=index+data[index];
		if (canWin(data, visited, newIdx)) return true;
		newIdx=index-data[index];
		if (canWin(data, visited, newIdx)) return true;
		visited[index]=false;
		return false;
	}
예제 #2
0
unsigned int AIShell::winWays(int**& state, int player, struct timeval& start)
{
    unsigned int result = 0;
    
    for(int i = 0; i < numCols; i++)
    {
        for(int j = 0; j < numRows; j++)
        {
            if(state[i][j] == player)
            {
                std::string dirList[8]= {"N", "S", "W", "E", "NW", "NE", "SW", "SE"};
                for (int p=0; p<=7; p++)
                {
                    if(canWin(state, i, j, 0, player, dirList[p], start) == k) {result++;}
                    if(!isUnderLimit(start)) {return result;}
                }
            }
            
            if(!isUnderLimit(start)) {return result;}
        }
        
        if(!isUnderLimit(start)) {return result;}
    }
    
    return result;
}
예제 #3
0
int ComputerPlayer::takeTurn(Board boards[], int nextBoard) {
	if (level == 1) {
		if (boards[nextBoard].hasWinner() != 0) {
			for (int i = 8; i >= 0; i--) {
				if (boards[nextBoard].getSpace(i) == 0) return i;
			}
		}
		int c = canWin(boards[nextBoard]);
		if (c != -1) return c;
		int priority[] = {6, 2, 0, 8, 4, 3, 5, 7, 1};
		for (int i = 0; i < 9; i++) {
			if (boards[nextBoard].getSpace(priority[i]) == 0)
				return priority[i];
		}
		return 0;
	}
	if (level == 2) {
		if (boards[nextBoard].hasWinner() != 0) {
			for (int i = 8; i >= 0; i--) {
				if (boards[nextBoard].getSpace(i) == 0) return i;
			}
		}
		int max = -10000;
		int maxIndex = 0;
		for (int i = 0, h = boards[nextBoard].gt.root->children.size(); i < h; i++) {
			int s = boards[nextBoard].gt.root->children[i]->score;
			if (s > max) {
				max = s;
				maxIndex = i;
			}
		}
		return boards[nextBoard].gt.root->children[maxIndex]->move;
	}
	return 3;
}
예제 #4
0
 bool canWin(string s) {
     if (s.size() == 0) {
         return false;
     }
     for (size_t i = 0; i < s.size() - 1; ++i) {
         if (s[i] == '+' && s[i + 1] == '+') {
             s[i] = '-'; s[i + 1] = '-';
             if (!canWin(s)) { return true; }
             s[i] = '+'; s[i + 1] = '+';
         }
     }
     return false;
 }
예제 #5
0
 bool canWin(string& s) {
     if(s.length()<2) return false;
     for(int i=0; i<s.length()-1; i++){
         if(s[i]=='+' && s[i+1]=='+'){
             s[i] = '-';
             s[i+1] = '-';
             bool win = canWin(s);
             s[i] = '+';
             s[i+1] = '+';
             if(!win) return true;
         }
     }
     return false;
 }
예제 #6
0
 bool canWin(string s) {
     if (!lookup_.count(s)) {
         const int n = s.length();
         bool is_win = false; 
         for (int i = 0; !is_win && i < n - 1; ++i) {
             if (s[i] == '+') {
                 for (; !is_win && i < n - 1 && s[i + 1] == '+'; ++i) {
                     s[i] = s[i + 1] = '-';
                     is_win = !canWin(s); 
                     s[i] = s[i + 1] = '+';
                     lookup_[s] = is_win;
                 }
             }
         }
     }
     return lookup_[s];  
 }
예제 #7
0
QPoint BoardStatus::getNextStep()
{
    if (this->isEmpty())
    {
        return getBoardCenter();
    }

    lookForward();

    if (canWin())
    {
        updateStatus();
        lookForwardOnce();
    }

    addChessAt(this->nextStep[0]->x(), this->nextStep[0]->y(), whiteChess);

    //printTypeNum();

    return *this->nextStep[0];
}
예제 #8
0
 bool canWin(string s) {
     for (int i = -1; (i = s.find("++", i + 1)) >= 0; ) {
         if (!canWin(s.substr(0, i) + '-' + s.substr(i+2))) return true;
     }
     return false;
 }
예제 #9
0
	bool canWin(vector<int> data, int index) {
		int n=data.size();
		vector<bool> visited(n, false);
		return canWin(data, visited, index);
	}