算是我比较擅长的类型,自己想想就会了。普通小状压,状态傻子都能想出来。一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分。后来看讨论版。。。mod竟然是1e8+7!!!这不有毒吗。。。

题干:

题目背景使用过Android 手机的同学一定对手势解锁屏幕不陌生。Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案。如下面三个例子所示:题目描述画线时还需要遵循一些规则:连接的点数不能少于4 个。也就是说只连接两个点或者三个点会提示错误。两个点之间的连线不能弯曲。每个点只能“使用”一次,不可重复。这里的“使用”是指手指划过一个点,该点变绿。两个点之间的连线不能“跨过”另一个点,除非那个点之前已经被“使用”过了。对于最后一条规则,参见下图的解释。左边两幅图违反了该规则; 而右边两幅图(分别为2->4-1-3-6 和6->5-4->1->9-2) 则没有违反规则,因为在“跨过”点时,点已经被“使用”过了。现在工程师希望改进解锁屏幕,增减点的数目,并移动点的位置,不再是一个九宫格形状,但保持上述画线的规则不变。请计算新的解锁屏幕上,一共有多少满足规则的画线方案。
输入输出格式
输入格式:输入文件第一行,为一个整数n,表示点的数目。接下来n 行,每行两个空格分开的整数xix_ixi​ 和yiy_iyi​,表示每个点的坐标。输出格式:输出文件共一行,为题目所求方案数除以100000007 的余数。

30

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1 << 30;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op) x = -x;
}
template <class T>
void write(T x)
{if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10);
}
const int mod = 1e9 + 7;
const int N = 21;
int dp[1 << N][N];
int x[N],y[N],n,ans;
/*void dfs(int now,int u,int len)//zhuangtai.xianzaidedian,changdu
{if(dp[now][u]) return dp[now][u];for(int i = 1;i <= n;i++){if(now & (1 << (i - 1)) == 0){int ok = 0;duke(j,1,n){if(now & (1 << (i - 1)) == 0){if(check(u,j,i) == false){ok = 1;break;}}}if(ok == 0){dfs(now | (1 << (i - 1)),i,len + 1);dp[now][u] += dp[now | (1 << (i - 1))]}}}
}*/
bool check(int a,int b,int c)
{/*if(a == 1 && c == 3 && b == 2)printf("%d %d %d\n",a,b,c);*/if((y[b] - y[a]) * (x[c] - x[b]) != (y[c] - y[b]) * (x[b] - x[a]))return true;if(x[a] > x[b] && x[c] > x[b])return true;if(x[a] < x[b] && x[c] < x[b])return true;if(y[a] > y[b] && y[c] > y[b])return true;if(y[a] < y[b] && y[c] < y[b])return true;return false;
}
void p(int now)
{duke(i,1,n){if((now & (1 << (i - 1))) != 0)printf("1");elseprintf("0");}
}
int main()
{read(n);duke(i,1,n)read(x[i]),read(y[i]);duke(i,0,n - 1){dp[1 << i][i + 1] = 1;}for(int now = 1;now <= (1 << n) - 1;now++){duke(i,1,n){if((now & (1 << (i - 1))) != 0){duke(j,1,n){if((now & (1 << (j - 1))) != 0 && i != j){int ok = 0;duke(k,1,n){if((now & (1 << (k - 1))) == 0)if(check(i,k,j) == false){ok = 1;//cout<<i<<" "<<j<<" "<<k<<endl;break;}}if(ok == 0){dp[now][i] += dp[now - (1 << (i - 1))][j];
//                            p(now),printf(" ");cout<<i<<" "<<j;printf(" ");p(now - (1 << (i - 1)));
//                            puts("");dp[now][i] %= mod;}}}}}int tot = 0;duke(i,0,n - 1){if((now & (1 << i)) != 0)tot++;}if(tot >= 4){duke(i,1,n){if((now & (1 << (i - 1))) != 0)ans += dp[now][i],ans %= mod;}}}
//    ans += 1;
//    ans /= 2;/*duke(i,0,(1 << n) - 1){duke(j,1,n)if((i & (1 << (j - 1))) != 0)p(i),printf(" "),cout<<dp[i][j]<<endl;}*/printf("%d\n",ans);return 0;
}

AC代码:

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = 1 << 30;
typedef long long ll;
typedef double db;
template <class T>void read(T &x)
{char c;bool op = 0;while(c = getchar(), c < '0' || c > '9')if(c == '-') op = 1;x = c - '0';while(c = getchar(), c >= '0' && c <= '9')x = x * 10 + c - '0';if(op) x = -x;
}
template <class T>
void write(T x)
{if(x < 0) putchar('-'), x = -x;if(x >= 10) write(x / 10);putchar('0' + x % 10);
}
const int mod = 1e8 + 7;
const int N = 21;
int dp[1 << N][N];
int x[N],y[N],n,ans;
bool check(int a,int b,int c)
{/*if(a == 1 && c == 3 && b == 2)printf("%d %d %d\n",a,b,c);*/if((y[b] - y[a]) * (x[c] - x[b]) != (y[c] - y[b]) * (x[b] - x[a]))return true;if(x[a] > x[b] && x[c] > x[b])return true;if(x[a] < x[b] && x[c] < x[b])return true;if(y[a] > y[b] && y[c] > y[b])return true;if(y[a] < y[b] && y[c] < y[b])return true;return false;
}
void p(int now)
{duke(i,1,n){if((now & (1 << (i - 1))) != 0)printf("1");elseprintf("0");}
}
vector <int> mp[N][N];
void init(int x,int y)
{for(int i = 1;i <= n;i++){if(check(x,i,y) == false){mp[x][y].push_back(i);}}
}
int main()
{read(n);duke(i,1,n)read(x[i]),read(y[i]);duke(i,0,n - 1){dp[1 << i][i + 1] = 1;}duke(i,1,n)duke(j,1,n)init(i,j);for(int now = 1;now <= (1 << n) - 1;now++){duke(i,1,n){if((now & (1 << (i - 1))) != 0){duke(j,1,n){if((now & (1 << (j - 1))) != 0 && i != j){int ok = 0;duke(f,0,(int)mp[i][j].size() - 1){int k = mp[i][j][f];if((now & (1 << (k - 1))) == 0){ok = 1;//cout<<i<<" "<<j<<" "<<k<<endl;break;}}if(ok == 0){dp[now][i] += dp[now - (1 << (i - 1))][j];
//                            p(now),printf(" ");cout<<i<<" "<<j;printf(" ");p(now - (1 << (i - 1)));
//                            puts("");dp[now][i] %= mod;}}}}}int tot = 0;duke(i,0,n - 1){if((now & (1 << i)) != 0)tot++;}if(tot >= 4){duke(i,1,n){if((now & (1 << (i - 1))) != 0)ans += dp[now][i],ans %= mod;}}}
//    ans += 1;
//    ans /= 2;/*duke(i,0,(1 << n) - 1){duke(j,1,n)if((i & (1 << (j - 1))) != 0)p(i),printf(" "),cout<<dp[i][j]<<endl;}*/printf("%d\n",ans);return 0;
}

代码:

转载于:https://www.cnblogs.com/DukeLv/p/10503723.html

P4460 [CQOI2018]解锁屏幕相关推荐

  1. 题解 P4460 【[CQOI2018]解锁屏幕】

    题目链接:Link Problem 题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构 ...

  2. [CQOI2018] 解锁屏幕

    题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案.如下面三个例子所示: ...

  3. [CQOI2018] 解锁屏幕(状压dp)

    problem luogu-P4460 solution 题面以及数据告诉我们显然是状压 dpdpdp. 设 f(s,i):f(s,i):f(s,i): 经过的点集 sss 最后一次画的点为 iii ...

  4. [CQOI2018]解锁屏幕

    https://zybuluo.com/ysner/note/1144441 题面 戳我 \(n\leq20\) 解析 这数据范围显然是状压. 可以发现,区分不同方案的标准是选的点和终结点. 于是设\ ...

  5. Windows 10系统如何使用Ctrl+Alt+Delete解锁屏幕?

    Win10系统在屏幕保护界面中只要按下随机按键或者鼠标按键都可以进入电脑界面,这样就容易被别人无意点开电脑屏幕造成资料泄漏,有没有办法可以设置解锁屏幕的触发按键呢?参见下文. 解决方法: 1.在小娜C ...

  6. android锁屏唤醒并解锁屏幕

    1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕: [java] view plain copy public static void wakeUpAndUnlock(Context contex ...

  7. android aoto未解锁,【求教】为什么我的解锁屏幕代码缺无法解锁屏幕

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我运行后报错,有谁知道吗? if(!device.isScreenOn()) { //点亮屏幕 device.wakeUp(); sleep(1000); ...

  8. android 自动亮屏解锁,android锁屏唤醒并解锁屏幕

    1.这个方法是实现锁屏状态下唤醒手机,亮屏并解锁屏幕:public static void wakeUpAndUnlock(Context context){ //屏锁管理器 KeyguardMana ...

  9. Android唤醒、解锁屏幕代码实例

    这篇文章主要介绍了Android唤醒.解锁屏幕代码实例,本文讲解了唤醒.解锁屏幕需要的权限和操作代码实例,代码中包含详细注释,需要的朋友可以参考下 所需权限: 复制代码 代码如下: < uses ...

最新文章

  1. 金邦黑金刚4G内存 VS Vista系统
  2. 基金委最新改革:9大科学部整合为4个板块资助布局
  3. 对于webservice响应,text / xml与application / xml之间有什么区别
  4. UML建模之活动图介绍
  5. jq调用android方法,Android端JQueryMobile使用教程(一)
  6. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
  7. 2022中国私域流量管理研究报告
  8. 在Azure Data Studio中探索SandDance可视化扩展
  9. 论文解读——Improving Object Detection With One Line of Code
  10. php独立环境的安装:apache php mysql
  11. 暗黑系?No...,打造一款 IDEA 护眼主题方案!
  12. c语言qq聊天刷屏代码大全,QQ聊天刷屏脚本 达人分享技巧
  13. html背景图片纵向拉伸,html网页背景图片拉伸 关于html背景图片往下拉伸问题
  14. LANP 环境搭建,git配置,ftp配置等
  15. 许鹏:从零开始学习,Apache Spark源码走读
  16. UVA - 10105 Polynomial Coefficients
  17. 标号法(Dijkstra)求最短路 matlab
  18. life: zz 关于爱情
  19. torch.chunk()
  20. 我的Substance Designer 学习笔记02-PBR材质学习理解

热门文章

  1. Cent OS 7.7 搭建蓝鲸智云社区版5.1.27(2)——标准部署
  2. 堆(heap):先进先出,栈(stack)先进后出
  3. 前端学习第三章——a标签(超链接)
  4. linuxprobe-第一节课
  5. Rosalind Python|Inferring mRNA from Protein
  6. 腾讯位置 - 服务端IP定位(结尾附视频)
  7. 这5个奇妙的Python库,你必须要试试,学python咱就是玩,欸~
  8. python3解两数之和
  9. html中确认密码怎么,HTML确认密码
  10. 不会R语言也能作出高大上的科研图片