void traverseGraph(const vector<vector<char> > &graph, int i, int j, vector<vector<bool> > &traversed) {
    //cout<<"Traversing "<<i<<" "<<j<<endl;
    traversed[i][j] = true;
    if((getCharAt(graph,i-1,j) == 'O') && (!traversed[i-1][j])) {
        traverseGraph(graph, i-1, j, traversed);
    }
    if((getCharAt(graph,i+1,j) == 'O') && (!traversed[i+1][j])) {
        traverseGraph(graph, i+1, j, traversed);
    }
    if((getCharAt(graph,i,j-1) == 'O') && (!traversed[i][j-1])) {
        traverseGraph(graph, i, j-1, traversed);
    }
    if((getCharAt(graph,i,j+1) == 'O') && (!traversed[i][j+1])) {
        traverseGraph(graph, i, j+1, traversed);
    }
}
void Solution::solve(vector<vector<char> > &A) {
    if (A.size() == 0) { return; }
    
    vector<vector<bool> > traversed(A.size(), vector<bool>(A[0].size(), false));
    int i, j;
    
    // Traverse all the edges of the board
    for (j = 0; j < A[0].size(); j++) {
        if (A[0][j] == 'O') {
            traverseGraph(A, 0, j, traversed);
        }
    }
    for (j = 0; j < A[0].size(); j++) {
        if (A[A.size()-1][j] == 'O') {
            traverseGraph(A, A.size()-1, j, traversed);
        }
    }
    for (i = 0; i < A.size(); i++) {
        if (A[i][0] == 'O') {
            traverseGraph(A, i, 0, traversed);
        }
    }
    for (i = 0; i < A.size(); i++) {
        if (A[i][A[0].size()-1] == 'O') {
            traverseGraph(A, i, A[0].size()-1, traversed);
        }
    }
    
    // Mark all the 'O's not visitied as X
    for (i = 0; i < A.size(); i++) {
        for (j = 0; j < A[0].size(); j++) {
            if(A[i][j] == 'O' && !traversed[i][j]) {
                A[i][j] = 'X';
            }
        }
    }
    
}
Exemplo n.º 3
0
/*-------------------------------------------------------------------------------------------------
  Traverse the entire graph reachable through forward edges from this node.  Return the number
  of nodes reached.
-------------------------------------------------------------------------------------------------*/
static uint32 traverseGraph(
    grNode node)
{
    grNode nextNode;
    grEdge edge;
    uint32 numNodes = 1;

    grNodeSetVisited(node, true);
    grForeachNodeOutEdge(node, edge) {
        nextNode = grEdgeGetToNode(edge);
        if(!grNodeVisited(nextNode)) {
            numNodes += traverseGraph(nextNode);
        }
    } grEndNodeOutEdge;
Exemplo n.º 4
0
Node* NFAGenerator::traverseGraph(Node* n,const int endNumber, int from){


	if( visited.find(n->nodeNum) != visited.end() ){
		return visited.at(n->nodeNum);//already found
	}else{
		// not found, new node, iterate on it's edges
		//visited[n->nodeNum]= insert(contorPairing(n->nodeNum,from));
		map<char,vector<Node*>> edges;
		map<char,vector<Node*>>::iterator mapit = edges.begin();
		vector<Node*>::iterator vecit;
		vector<Node*>::iterator newVecit;
		Node* newNode = new Node();
		visited[n->nodeNum]=newNode;


		for ( mapit = n->edges.begin(); mapit!=n->edges.end(); ++mapit){// iterate on map
			vector<Node*> nodes;
			vector<Node*> newNodes;
			nodes = mapit->second;
			vecit = nodes.begin();
			newVecit = newNodes.begin();
			for(int i = 0 ; i < nodes.size() ; i++){// iterate on vector
				Node* temp = traverseGraph(nodes.at(i),endNumber, n->nodeNum);
				if(temp != NULL){
					newVecit = newNodes.insert(newVecit,temp);
				}
			}
			edges[mapit->first]=newNodes;
		}
		newNode->state.accepted = n->state.accepted;
		newNode->state.token = n->state.token;
		newNode->edges = edges;
		if(n->nodeNum == endNumber){
			end = newNode;
		}
		//visited[n->nodeNum]=newNode;
		return newNode;
	}
}
Exemplo n.º 5
0
Node* NFAGenerator::copyGraph(Node* n,const int endNumber, int from){
	visited.clear();
	return traverseGraph(n,endNumber,from);
}
Exemplo n.º 6
0
int main(int argc, char **argv){
	#ifndef TEST
	// Minimum number of nodes required to create a graph is three:
	//
	//		    A
	//		  /   \
	//		 B --- C
	//
	// and maximum is set to 18000 (about 1.5 GB of RAM allocated).
	// Theoretically our graph algorithms can work with up to as many
	// nodes we want, but we have restricted the present program to 
	// generate graphs up to 18k nodes due to memory limitations some 
	// computers may have.
	const unsigned int minimum = 3, maximum = 18000;
	unsigned int current, nodes, digits;
	EDGE** mat;

	srand(time(NULL));

	if(argc == 1){
		fprintf(stderr, "No number of nodes passed\n");
		usage();
		return 1;
	}
	digits = strlen(argv[1]);
	for(current = 0; current < digits; current++){
		if (!isdigit(argv[1][current])){
			fprintf(stderr, "%s is not a valid number\n", argv[1]);
			usage();
			return 1;
		}
	}
	nodes = strtol(argv[1], NULL, 10);
	if((nodes < minimum) || (nodes > maximum)){
		fprintf(stderr, "%d is not between the allowed limits\n", nodes);
		usage();
		return 1;
	}
	mat = Allocate(EDGE*, nodes);
	for(current = 0; current < nodes; current++){
		mat[current] = Allocate(EDGE, nodes);
	}
	// Create a random singed graph
	createGraph(mat, nodes);
	// and traverse it to check for its balance
	traverseGraph(mat, nodes);
	// Optionally run Graphviz but in any case don't run it while testing
	#ifdef VIZ
	vizGraph(mat, nodes);
	#endif

	for(current = 0; current < nodes; current++){
		free(mat[current]);
	}
	free(mat);
	return 0;
	#endif

	// Cannot be here

	#ifdef TEST
	return RunTests();
	#endif
}