//1차원 배열 이용, 가지치기 & 백트래킹. 8 Queen.변경가능. #include <iostream> #include <fstream> #include <string> using namespace std; ifstream fin("input.txt"); ofstream fout("output.txt"); int n,cnt=0; int colc[20],ruc[20],luc[20],Q[8]={0}; void queen(int p){ if(p>=n){ cout << "[" << ++cnt << "]th" << endl; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(Q[i]==j) cout << "Q"; else cout << "#"; } cout << endl; } cout << endl; } else{ for(int j=0;j<n;j++){ if(colc[j]==0 && ruc[p+j]==0 && luc[p-j+n]==0){ Q[p]=j; colc[j]=ruc[p+j]=luc[p-j+n]=1; queen(p+1); colc[j]=ruc[p+j]=luc[p-j+n]=0; } } } } void main(){ n=8; for(int i=0;i<n*2;i++){ colc[i]=ruc[i]=luc[i]=0; } queen(0); }
전체 글
퀸문제
2009. 7. 29. 21:05
해밀튼의 회로
2009. 7. 29. 21:03
#include <iostream> #include <fstream> #include <string> using namespace std; ifstream fin("input.txt"); ofstream fout("output.txt"); int a[8][8]={{0,1,0,1,0,1,0,0}, {1,0,1,0,0,0,1,0}, {0,1,0,1,0,0,0,1}, {1,0,1,0,1,0,0,0}, {0,0,0,1,0,1,0,1}, {1,0,0,0,1,0,1,0}, {0,1,0,0,0,1,0,1}, {0,0,1,0,1,0,1,0}}; int node,start,index,check[30],cycle[30]; void hamilton(int i,int index){ cycle[index]=i; check[i]=1; if(index == node-1 && a[i][start]==1){ for(int j=0;j<node;j++) cout << cycle[j]+1 << " "; cout << endl; } else{ for(int j=0;j<node;j++){ if(a[i][j]==1 && check[j]==0){ hamilton(j,index+1); check[j]=0; } } } } void main(){ node=8; start=0; hamilton(start,0); }
오일러 순환로
2009. 7. 29. 21:02
#include <iostream> #include <fstream> #include <string> using namespace std; ifstream fin("input.txt"); ofstream fout("output.txt"); int a[6][6]={{0,1,1,0,1,1}, {1,0,3,1,0,1}, {1,3,0,1,1,0}, {0,1,1,0,1,1}, {1,0,1,1,0,1}, {1,1,0,1,1,0}}; int node, edge, start, cycle[30]; void euler(int i,int index){ cycle[index]=i; if(index == edge && i==start){ //i==start 생략시 오일러 경로 for(int j=0;j<edge+1;j++) cout << cycle[j]+1 << " "; cout << endl; } else{ for(int j=0;j<node;j++){ if(a[i][j]>0){ a[i][j]--; a[j][i]--; euler(j,index+1); a[i][j]++; a[j][i]++; } } } } void main(){ node=6; edge=14; start=0; euler(start, 0); }