描述:
输出8皇后问题所有结果。
输入:
没有输入。
输出:
每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。
输入样例:
输出样例:
输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...
提示:
输出样例是正确输出结果的前几行。
解题思路:用range[9],line1[17],line2[17]来标记不能放,一直找到符合的位置,用回溯解题这个问题。
代码如下:
- #include<iostream>
- using namespace std;
- int record[92][9],mark[9],count=0;
- bool range[9],line1[17],line2[17];
- void tryToPut(int);
- void main()
- {
- int i,testtimes,num;
- for(i=0;i<=8;i++)
- range[i]=true;
- for(i=0;i<17;i++)
- line1[i]=line2[i]=true;
- tryToPut(1);
- for(num=1;num<=92;num++)
- {
- cout<<"No "<<num<<':'<<endl;
- for(i=1;i<=8;i++)
- {
- for(int j=1;j<=8;j++)
- {
- if(j==record[num-1][i])
- cout<<'A';
- else
- cout<<'.';
- }
- cout<<endl;
- }
- }
- }
- void tryToPut(int i)
- {
- if(i>8)
- {
- for(int k=1;k<9;k++)
- record[count][k]=mark[k];
- count++;
- }
- for(int j=1;j<=8;j++)
- {
- if(range[j]&&line1[i+j]&&line2[i-j+9])
- {
- mark[i]=j;
- range[j]=line1[i+j]=line2[i-j+9]=false;
- tryToPut(i+1);
- range[j]=line1[i+j]=line2[i-j+9]=true; //默认不放
- }
- }
- }