8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占一行。
于是我们可以定义一个string字符串,字符串中第i个数字表示位于第i行的皇后的列号。
先把string字符串分别用0~7初始化,接下来就是对字符串做全排列。
因为我们用不同的数字初始化字符串,所以任意两个皇后肯定不同列。
我们只需判断每一个排列对应的8个皇后是不是在同一对角线上,
也就是对于string的两个下标i和j,是不是有:
( j - i ) == ( str[i] - str[j] ) 或者 ( i - j ) == ( str[i] - str[j] )。
具体代码如下:
1 void Permutation(string Str, int begin, int end ,vector<string>& vec)//得到全排列 2 { 3 if(begin == end - 1) //只剩一个元素 4 { 5 vec.push_back(Str); 6 } 7 else 8 { 9 for(int k = begin; k < end; k++) 10 { 11 swap(Str[k], Str[begin]); //交换两个字符 12 Permutation(Str, begin + 1, end ,vec); 13 swap(Str[k],Str[begin]); //恢复 14 } 15 } 16 } 17 18 void HuangHou(vector<string>& vec)//获得可行方案 19 { 20 string Str = "01234567"; 21 Permutation(Str ,0 ,8 ,vec); 22 for (vector<string>::iterator it = vec.begin() ; it != vec.end() ;) 23 { 24 bool dele = false; 25 string str = *it ; 26 int len = str.length(); 27 for (int i = 0 ; i < len ;i++) 28 { 29 for (int j = i+1 ; j < len ;j++) 30 { 31 if ( ( j - i ) == ( str[i] - str[j] ) || ( i - j ) == ( str[i] - str[j] ) ) 32 { 33 it = vec.erase(it); 34 dele = true ; 35 break; 36 } 37 38 } 39 if (dele == true) 40 { 41 break; 42 } 43 } 44 45 if (dele != true) 46 { 47 it++; 48 } 49 } 50 51 52 } 53 int main() 54 { 55 vector<string> vec ; 56 HuangHou(vec); 57 cout<<vec.size()<<endl; 58 for (vector<string>::iterator it = vec.begin() ; it != vec.end() ;it++) 59 { 60 cout<<*it<<endl; 61 } 62 63 getchar(); 64 return 0; 65 }
每行字符串分别代表0到7行皇后的列位置。
来源:https://www.cnblogs.com/csxcode/p/3718664.html