八皇后 DFS!(附加百练2574输出皇后串)

今天在数据结构实验课上敲POJ1321不会写,郁闷啊郁闷。。。党说先把八皇后写了,就写了。。。

 

写完了发现,输出了40320.。。正确答案是92.。。郁闷啊郁闷。。。

 

该下课了,想起来了,八皇后是同列同行对角线均不能有皇后啊!!!崩溃,我把对角线给忘了。回寝室后,没想到太好的方法,就用了4个while循环把从visit[D][I]出发的两条对角线上的点给过一遍。

 

看着92这俩数字,激动啊啊啊 ~~~~!!!

 

找八皇后的题做,OJ上均为变形题。。。纠结。。

 

百练上这题是输入一个n,求找的第n个皇后串,即从第一行开始,输出每行皇后在第几列。。。

 

纠结了好大一会。。。应该存的下标是Q的,我又开了个计数的数,导致错得一塌糊涂。。。经党指点。。顺利出结果啦~~哈哈

 

八皇后代码

 

//八皇后 #include <stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> using namespace std; const int n = 8; int map[10][10],visit[10][10]; int num,Q; int find(int x,int y) { int sum = 0; for(int i=1; i<=n; i++) //判断对应的列是否已有皇后 { sum += visit[i][y]; } int b = y; int a = x; for(int i=1; i<=n; i++) for(int k=1; k<=n; k++) { if( abs( i-x ) == abs( k-y )) sum += visit[i][k]; } /* while( b<=8 && a<=8 ) // 以下判断对角线上是否已有皇后这种方法麻烦了点 { //从点ab出发的对角线,左上左下右上右下四条,速度比上面的快 b++; a++; sum += visit[a][b]; } b = y; a = x; while( b>=1 && a<=8 ) { b--; a++; sum += visit[a][b]; } b = y; a = x; while( b<=8 && a>=1 ) { b++; a--; sum += visit[a][b]; } b = y; a = x; while( b>=1 && a>=1 ) { b--; a--; sum += visit[a][b]; }*/ return sum == 0 ? 1 : 0 ; } void DFS(int d) { if( Q == 8 ) { num++; return; } for(int i=1; i<=n; i++) { if( !visit[d][i] && find(d,i) ) { visit[d][i] = 1; Q++; DFS( d+1 ); visit[d][i] = 0; Q--; } } } int main() { num = 0; Q = 0; memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); DFS(1); cout << num << endl; system("pause"); return 0; }

 

百练 2754 直接拿上个代码改的

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <memory.h> using namespace std; const int n = 8; int map[10][10],visit[10][10]; int num,Q,nq,flag; int find(int x,int y) { int sum = 0; for(int i=1; i<=n; i++) //判断对应的列是否已有皇后 { sum += visit[i][y]; } for(int i=1; i<=n; i++) for(int k=1; k<=n; k++) { if( abs( i-x ) == abs( k-y )) sum += visit[i][k]; } return sum == 0 ? 1 : 0 ; } int col[10],cou = 0; void DFS(int d) { if( flag ) return ; if( Q == 8 ) { if( num == nq-1 ) { for(int i=1; i<=n; i++) cout << col[i]; cout << endl; flag = 1; } num++; return; } for(int i=1; i<=n; i++) { if( !visit[d][i] && find(d,i) ) { visit[d][i] = 1; Q++; col[Q] = i; DFS( d+1 ); visit[d][i] = 0; Q--; } } } int main() { int ncases; cin >> ncases; while( ncases-- ) { cin >> nq; Q = num = flag = 0; memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); DFS(1); } return 0; }

你可能感兴趣的:(数据结构,System)