Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <cstdlib>
- using namespace std;
- FILE *in;
- bool Finished;
- struct Queen {
- int var;
- vector<int> domen;
- vector<bool> visited;
- };
- void ForwardCheck(vector<struct Queen> &Q, int index, int N)
- {
- for(int i=index+1; i<N; i++) {
- Q[i].visited[ Q[index].var ] = true;
- if( Q[index].var + (i-index) < N )
- Q[i].visited[ Q[index].var + (i-index) ] = true;
- if( Q[index].var - (i-index) > 0 )
- Q[i].visited[ Q[index].var - (i-index) ] = true;
- }
- // Pratim vrijednosti - "manual" debug
- system("cls");
- for(int i=1; i<N; i++) {
- printf("Q%d\n", i);
- printf("VAR: %d\n", Q[i].var);
- printf("DOMEN: ");
- for(int k=1; k<N; k++)
- printf("%d ", k);
- printf("\n");
- printf("VISITED: ");
- for(int k=1; k<N; k++) {
- if(Q[i].visited[k] == true)
- printf("T");
- else printf("F");
- }
- printf("\n\n");
- }
- }
- int CSP(vector<struct Queen> Q, int index, int N)
- {
- if(index == N) {
- Finished = true;
- for(int i=1; i<N; i++)
- printf("%d ", Q[i].var);
- }
- else
- while( !Finished )
- {
- int VAR;
- bool found = false;
- for(int i=1; i<N; i++) {
- if(Q[index].visited[i] == false) {
- VAR = Q[index].domen[i];
- Q[index].visited[i] = true;
- found = true;
- break;
- }
- }
- if(found == false) return 0;
- Q[index].var = VAR;
- ForwardCheck(Q, index, N);
- CSP(Q, index+1, N);
- }
- return 0;
- }
- int main()
- {
- in = fopen("test.in", "r");
- int N;
- Finished = false;
- fscanf(in, "%d", &N);
- N = N+1; // Zbog indexiranja, da pocne od 1 do N-1
- vector<struct Queen> Q;
- // Init
- for(int i=0; i<N; i++) {
- Queen newQueen;
- for(int k=0; k<N; k++) {
- newQueen.domen.push_back( k );
- bool newBool = false;
- newQueen.visited.push_back( newBool );
- }
- Q.push_back( newQueen );
- }
- CSP(Q, 1, N);
- fclose(in);
- return 0;
- }
Add Comment
Please, Sign In to add comment