/* DFS * 行从0到7逐层增加,不会存在重复放到同一行的情况 * 列需要用bool col[8]记录某行是否已经放置 * 对角线则需要用一个bool matrix[8][8](代码里用到矩阵名是djx),并放到Judge(int x,int y)中判断 * 然后思路就比较简单了,按照DFS对可扩展的状态进行递归 * 每层的可扩展状态满足: * (1)列上没有其它棋子 * (2)对角线上没有棋子 * 好像把DFS中的now换成row更容易理解? */ #include <cstdio> #include <iostream> #include <vector> #include <algorithm> using namespace std; const int maxN = 8; bool djx[maxN][maxN] = {false}; bool col[maxN] = {false}; vector<int> vi; //可以用string bool Judge(int x,int y){ //用于判断当前条件下(djx数组目前的状态下)对角线上是否已经有棋子了 int y2 = y; for(int i=x;i>=0;i--){ if(y>=0 && djx[i][y--]==true) return false; if(y2<8 && djx[i][y2++]==true) return false; } return true; } void DFS(int now,int ans){ if(now==8){ vi.push_back(ans); return ; } for(int j=0;j<8;j++){ //完全的DFS思路 if(!col[j] && Judge(now,j)){ col[j] = true; djx[now][j] = true; //注意:题目里的所有数字都是从1开始计数,所以使用j+1记录answer DFS(now+1,ans*10+j+1); //可以用string,由于最长8为十进制数,所以用int了 col[j] = false; djx[now][j] = false; } } } int main(){ DFS(0,0); sort(vi.begin(),vi.end()); //对answer进行排序 int index; while(cin>>index){ cout<<vi[index-1]<<endl; //注意题目中所有数字均为从1计数 } return 0; }