DeleteMe) 페이지 제목에 대한 통일성 관계상 페이지 이름 수정을 했습니다. --1002
8퀸즈 소스1 ¶
2h:30m, 71line
~cpp #include <iostream.h> struct QUEEN{ int x; int y; }; int map[8][8]; bool MARK(QUEEN Pt); int main(){ QUEEN history[8]; int nQueens=0; history[0].x=0; history[0].y=0; bool bOk; while(!bOk || nQueens<8){ for(int i=0;i<8;i++) for(int j=0;j<8;j++) map[i][j]=0; for(i=0;i<nQueens;i++) MARK(history[i]); do{ bOk=MARK(history[nQueens]); if(bOk){ if(nQueens!=7) history[nQueens+1]=history[nQueens]; nQueens++; } else{ if(++history[nQueens].x==8){ history[nQueens].x=0; if(++history[nQueens].y==8){ do{ nQueens--; }while(history[nQueens].x==7 && history[nQueens].y==7); if((++history[nQueens].x)==8){ history[nQueens].x=0; history[nQueens].y++; } break; } } } }while(!bOk); } for(int y=0;y<8;y++){ for(int x=0;x<8;x++){ if(map[x][y]==0) cout<<' '; else if(map[x][y]==1) cout<<'X'; else if(map[x][y]==2) cout<<'O'; } cout<<endl; } return 0; } bool MARK(QUEEN Pt){ int tmp[8][8]; for(int x=0;x<8;x++) for(int y=0;y<8;y++) tmp[x][y]=map[x][y]; if(tmp[Pt.x][Pt.y]>0) return false; for(int i=0;i<8;i++){ if(tmp[Pt.x][i]==2) return false; else tmp[Pt.x][i]=1; if(tmp[i][Pt.y]==2) return false; else tmp[i][Pt.y]=1; if(i-Pt.x+Pt.y<8 && i-Pt.x+Pt.y>=0){ if(tmp[i][i-Pt.x+Pt.y]==2) return false; else tmp[i][i-Pt.x+Pt.y]=1; } if(Pt.x+Pt.y-i<8 && Pt.x+Pt.y-i>=0){ if(tmp[i][Pt.x-i+Pt.y]==2) return false; else tmp[i][Pt.x-i+Pt.y]=1; } } tmp[Pt.x][Pt.y]=2; for(x=0;x<8;x++) for(int y=0;y<8;y++) map[x][y]=tmp[x][y]; return true; }