2016 UESTC Training for Search Algorithm & String A - Xiper的奇妙历险(1) 八皇后问题、dfs

来源:互联网 发布:三种网络分层结构 编辑:程序博客网 时间:2024/05/21 11:29




A - Xiper的奇妙历险(1)

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

西历772002年。

在喵哈哈村,有一个无忧无虑的少年XiperXiper。在贵族家庭长大的Xiper,每天无忧无虑地过着挠挠头,吹吹逼的快乐生活。

title

然而一天,一辆马车到达了xiper的家里。从马车上,走下一个优雅的年轻人。

“在下周日天,有何贵干!?”

title

原来在十年前,Xiper的爹曾被日天的爹所救。于是在日天的爹死后,xiper的爹为了报恩,收养了日天。

日天不仅挠头比Xiper快,吹逼也比Xiper屌,很快Xiper的朋友们都被日天给拉拢了。日天的到来,结束了Xiper无忧无虑的日子。

俗话说得好,上帝给你关上了一扇门,同时也会给你打开一扇窗户。在机缘巧合之下,郁闷的Xiper偶遇了美丽的卿学姐,并与她坠入了爱河。

然而,这一切都被狡诈的日天看在眼里。一日,日天趁着卿学姐独自一人,强吻了卿学姐。

“你的初吻不是Xiper的,而是我周日天的!”

夺妻之仇,不过如此!忍无可忍的Xiper终于向日天发起了挑战。他要日天在99列的国际象棋盘上摆下9个皇后,并使九个皇后互相无法攻击的

所有方案!

日天万万没想到,Xiper居然问他智力题。被智商碾压的日天当即吐出一口鲜血,倒地不起。

从此,日天不敢轻视Xiper,在表面上和Xiper和平相处。

那么问题来了,所有的方案到底是什么呢?

Input

一个数SIZESIZE(9<=SIZE<=9),代表棋盘的大小

Output

第一行输出一个数N,表示所有的方案数。

接下来N行,每行输出SIZE个数,第ii个数ai表示在第ii行第ai列放了皇后。

因为出题人懒得写spj,所以请按字典序输出每个方案。

Sample input and output

Sample InputSample Output
8///仅作为例子参考
921 5 8 6 3 7 2 4 1 6 8 3 7 4 2 5 1 7 4 6 8 2 5 3 1 7 5 8 2 4 6 3 (剩下88种请自行脑补)

Hint

如果任意两个皇后都不在同一行、同一列、同一斜线上,则是满足条件的方案。

只有一组测试数据。

由于出题人是个智障,输出答案时,每个方案最后一个数字后面要多输出一个空格再换行,不然似乎会PE...

Source

2016 UESTC Training for Search Algorithm & String


My Solution

八皇后问题


这里是九个皇后


逐行放置,则皇后肯定不会横向攻击,只需要检查纵向和两个斜向攻击即可


其中用 cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j] 来判断是否有斜向攻击


用 C[cur] == C[j] 检查纵向攻击




然后每次 cur == n 的时候这一钟情况就完成了, 把这个C[0~n-1] 存储到ans[tot][i]里


最后全部返回了 就得到了所有答案


然后for for 打印即可

#include <iostream>#include <cstdio>using namespace std;int n, tot, C[16];// n == 9, tot == 352int ans[352+8][9];void _search(int cur){    if(cur == n){        tot++;        for(int i = 0; i < n; i++){            ans[tot][i] = C[i];        }    }    else{        for(int i = 1; i <= n; i++){        //!行数的表示用 1 ~ n, 下标还是 0 ~ n-1            int ok = 1;            C[cur] = i;                     //把第cur行的皇后放在第C[cur] = i列            for(int j = 0; j < cur; j++){   //检查是否冲突                if(C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]){                    ok = 0; break;                }            }            if(ok) _search(cur+1);        }    }}//!HInt 每个方案最后一个数字后面要多输出一个空格再换行int main(){    #ifdef LOCAL    freopen("a.txt", "w", stdout);    #endif // LOCAL    tot = 0;    scanf("%d", &n);    _search(0);    printf("%d\n", tot);    for(int i = 1; i <= tot; i++){        for(int j = 0; j < n; j++){            printf("%d ", ans[i][j]);        }        printf("\n");    }    return 0;}

Thank you!

                                                                                                                                               ------from ProLights









































0 0