济南学习 Day 5 T3 am

【题目描述】

  众所不知,rly现在不会玩国际象棋。但是,作为一个OIer,rly当然做过八皇后问题.在这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在

n*n的棋盘中,摆放n个皇后使它们互相不能攻击到,求不同的解的数量,这就是经典的n皇后问题。现在问题推广n皇后问题,这个问题对你而言实

在是小菜一碟。但是因为上次rly把棋盘弄破了,又拿不出新的,所以rly打算难一点点,问题就是在破的棋盘上的n皇后问题。他想知道......(你们懂的..)

  妻子都是相同的

【输入说明】

  一行,一个整数N。

  接下来N行,每行N个整数,要么为0,表示没坏,要么为1,表示坏了。

【输出说明】

  一行,输出不同的接的数量。

【样例输入】

  4

  1 0 1 1

  1 1 1 0

  0 1 1 1

  1 1 0 1

【样例输出】

  1

【数据范围】

  对于40%的数据,N<=13。

  对于100%的数据,N<=16。

  对于30%的数据棋盘没有破,你可以认为rly又去买了一个新的。

 1 /*位运算优化n皇后*/
 2 #include<cstdio>
 3 #include<iostream>
 4 #define N 20
 5 using namespace std;
 6 int hang[N],n,ans;
 7 void dfs(int t,int a,int b,int c)//a,b,c都是二进制数,表示哪一列或对角线是否放过皇后,1为放过
 8 {
 9     if(t==n+1)
10     {
11         ans++;return;
12     }
13     int S=((1<<n)-1)&(~(hang[t]|a|b|c));
14     /*
15       S是一个二进制数,表示当前可以往哪一列放皇后
16       (hang[t]|a|b|c)表示哪些列从列和对角线的角度来说都放过
17       加上~(取反),表示哪些列可以放皇后
18     */
19     while(S)
20     {
21         int x=S&(-S);//x表示可以当前放皇后的位置
22         dfs(t+1,a+x,(b+x)<<1,(c+x)>>1);
23         S-=x;
24     }
25 }
26 int main()
27 {
28     scanf("%d",&n);
29     for(int i=1;i<=n;i++)
30       for(int j=1;j<=n;j++)
31       {
32           int x;scanf("%d",&x);
33           hang[i]+=x<<(j-1);
34       }
35     dfs(1,0,0,0);
36     printf("%d",ans);
37     return 0;
38 }

思路:位运算优化后的n皇后问题

时间: 2024-10-12 07:15:54

济南学习 Day 5 T3 am的相关文章

济南学习 Day 2 T3 am

[问题描述]m× m的方阵上有n棵葱,你要修一些栅栏把它们围起来.一个栅栏是一段沿着网格建造的封闭图形(即要围成一圈) .各个栅栏之间应该不相交.不重叠且互相不包含.如果你最多修k个栅栏,那么所有栅栏的长度之和最小是多少?[输入格式]第一行三个整数m,k,n.接下来n行每行两个整数x,y代表某棵葱的位置.[输出格式]一行一个整数代表答案.[样例输入 1]6 1 41 34 24 46 4[样例输出 1]18[样例输入 2]6 2 41 34 24 46 4[样例输出 2]16[样例解释]你猜树上

济南学习 Day1 T3 pm

[问题描述]小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在x轴正半轴和y轴正半轴分别挑选??个点.随后,他将x轴的点与y轴的点一一连接,形成??条线段,并保证任意两条线段不相交.小 Q 确定这种连接方式有且仅有一种.最后,小 Q 会给出m个询问.对于每个询问,将会给定一个点P(Px ,Py),请回答线段 OP 与m条线段会产生多少个交点?小 Q 找到了正在钻研数据结构的你,希望你可以帮他解决这道难题.[输

2016.10.30 济南学习 Day2 下午 T1

他 [问题描述] 一张长度为??的纸带,我们可以从左至右编号为0 ? ??(纸带最左端标号为 0).现在有??次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带 的长度是多少. [输入格式] 第一行两个数字??, ??如题意所述. 接下来一行??个整数代表每次折叠的位置. [输出格式] 一行一个整数代表答案. [样例输入] 5 2 3 5 [样例输出] 2 [样例解释] 树上有只鸟. [数据规模与约定] 对于60%的数据,??, ?? ≤ 3000. 对于100%的数据,?? ≤ 101

济南学习 Day2 T2 am

[问题描述]有??个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有??个数代表每一个数的值.[输出格式]输出一行一个分数 a/b代表答案,其中a,b互质.如果答案为整数则直接输出该整数即可.[样例输入 1]4 2 33 1 2 4[样例输出 1]7/10[样例输入 2]4 1 43 1 2 4[样例输出 2]1[样例解释]塔外面有棵树.[数据规模与约定]对于30%的数据,1<=N<

济南学习D2T1__折纸带

他[问题描述]一张长度为n的纸带,我们可以从左至右编号为0 ?n(纸带最左端标号为0) .现在有m次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少.[输入格式]第一行两个数字n,m如题意所述.接下来一行m个整数代表每次折叠的位置.[输出格式]一行一个整数代表答案.[样例输入]5 23 5[样例输出]2[样例解释]树上有只鸟.[数据规模与约定]60%的数据,n,m ≤ 3000.对于100%的数据,n≤ 10 18 ,m ≤ 3000. ___________________

济南学习 Day1 T2 pm

[问题描述]栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序.例如,借助一个栈,依次将数组 1,3,2 按顺序入栈或出栈,可对其从大到小排序:1 入栈:3 入栈:3 出栈:2 入栈:2 出栈:1 出栈.在上面这个例子中,出栈序列是 3,2,1,因此实现了对数组的排序.遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序.例如给定数组 2,1,3,借助一个栈,能获得的字典序最大的出栈序列是 3,1,2:2 入栈:1 入栈:3 入栈:3 出栈:1 出栈:2 出栈.请你借助一个栈,对一

济南学习D2T2__数学分析题

[问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有N个数代表每一个数的值.[输出格式]输出一行一个分数a/b 代表答案,其中a,b互质.如果答案为整数则直接输出该整数即可.[样例输入 1]4 2 33 1 2 4[样例输出 1]7/10[样例输入 2]4 1 43 1 2 4[样例输出 2]1[样例解释]塔外面有棵树.[数据规模与约定]30%的数据,1<=N<=10

济南学习 Day1 T1 am

题意:给你两个日期,问这两个日期差了多少毫秒 1 #include<cstdio> 2 #include<cstring> 3 #include<ctime> 4 #include<iostream> 5 #define ll long long 6 using namespace std; 7 int mth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 8 ll solve(){ 9 int Y=0,M=0,D

济南学习

死亡[问题描述]现在有M个位置可以打 sif,有N +1个人在排队等着打 sif.现在告诉你 个人每个人需要多长的时间打 sif,问你第N +1个人什么时候才能打 sif. (前N个人必须按照顺序来)[输入格式]第一行两个整数N,M如上所述.接下来N行每行一个整数代表每个人所需要用的时间.[输出格式]一行一个整数表示答案.[样例输入]3 2111[样例输出]1[样例解释]山里有座庙.[数据规模与约定]对于100%的数据,每个人所需用的时间不超过10 5 . 1 #include <cstdio>