ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861
这道题当时没做出来,后来经过队友提醒才做出来。
3*3的九宫格,给你其中n个点按下面要求连起来:
1. 给你的n个点都要激活(至少经过一次)
2. 如果点A,B相连后要经过另一个点C,则C在序列中的位置必须在A,B之前 如 1 7 4是不合法的
3.线段相交是没关系的,如 7 6 9 4
我是直接生成n个数的全排列,然后在所有排列里面去掉不合法的。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue> #define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long
#define inf 0x7f7f7f7f
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0) #define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define lowbit(x) (x)&(-x)
#define Read() freopen("data.txt", "r", stdin)
#define Write() freopen("a.txt", "w", stdout);
#define maxn 1000000000
#define N 500010
using namespace std; int b[N][];
int n,ans,p[],flag[]; bool check(int x)
{
memset(flag,,sizeof(flag)); //标记访问或者没访问
for(int i=;i<n;i++)
{
flag[b[x][i]]=;
if((b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==)
||(b[x][i]==&&b[x][i+]==&&flag[]==)||(b[x][i]==&&b[x][i+]==&&flag[]==))
return ;
}
return ;
}
int main()
{
//Read();
//Write();
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d",&p[i]);
sort(p,p+n);
ans=;
memset(b,,sizeof(b));
do
{
for(int i=;i<n;i++)
b[ans][i]=p[i];
ans++;
}while(next_permutation(p,p+n));
int x=ans;
for(int i=;i<ans;i++)
{
if(check(i)==)
x--;
}
printf("%d\n",x);
for(int i=;i<ans;i++)
{
if(check(i))
{
for(int j=;j<n;j++)
{
if(j!=n-)
printf("%d ",b[i][j]);
else
printf("%d\n",b[i][j]);
}
} }
}
return ;
}
dfs也可以做!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; int mp[][];
int a[];
int n;
bool vis[];
int cnt;
int s[]; void init()
{
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
mp[][] = ; mp[][] = ;
} void dfs(int pre,int num,int op)
{
// printf("%d %d\n",pre,num);
int i,t;
if(num==n)
{
if(op){
for(i=;i<n-;i++)printf("%d ",s[i]);
printf("%d\n",s[n-]);
}
cnt++;
return;
} for(i=;i<n;i++)
{
if(!vis[a[i]])
{
if(mp[pre][a[i]]==||vis[mp[pre][a[i]]]==true)
{
vis[a[i]]=true;
s[num]=a[i];
dfs(a[i],num+,op);
vis[a[i]]=false;
}
}
}
}
int main()
{
//freopen("a.txt","r",stdin);
int T,i,j;
scanf("%d",&T);
init();
while(T--)
{
scanf("%d",&n);
for(i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
cnt=;
for(i=;i<n;i++){
memset(vis,false,sizeof(vis));
vis[a[i]]=true;
s[]=a[i];
dfs(a[i],,);
}
printf("%d\n",cnt);
for(i=;i<n;i++){
memset(vis,false,sizeof(vis));
vis[a[i]]=true;
s[]=a[i];
dfs(a[i],,);
}
}
return ;
}
ZOJ Problem Set - 3861 Valid Pattern Lock(dfs)的更多相关文章
- ACM学习历程—ZOJ 3861 Valid Pattern Lock(dfs)
Description Pattern lock security is generally used in Android handsets instead of a password. The p ...
- DFS+模拟 ZOJ 3861 Valid Pattern Lock
题目传送门 /* 题意:手机划屏解锁,一笔连通所有数字,输出所有可能的路径: DFS:全排列 + ok () 判断函数,去除一些不可能连通的点:) */ #include <cstdio> ...
- ZOJ 3861 - Valid Pattern Lock
3861 - Valid Pattern Lock Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & ...
- ZOJ - 3861 Valid Pattern Lock 【全排列】
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861 思路 先生成全排列,然后判断哪些情况不符合的,剔除就好了 ...
- 浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock
这道题目是队友写的,貌似是用暴力枚举出来. 题意:给出一组数,要求这组数在解锁的界面可能的滑动序列. 思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2. 要 ...
- Valid Pattern Lock(dfs + 暴力)
Valid Pattern Lock Time Limit: 2 Seconds Memory Limit: 65536 KB Pattern lock security is genera ...
- ZOJ Problem Set - 3829Known Notation(贪心)
ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...
- ZOJ Problem Set - 1025解题报告
ZOJ Problem Set - 1025 题目分类:基础题 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=10 ...
- ZOJ Problem Set - 2563 Long Dominoes 【如压力dp】
称号:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形.求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的.比較火.链接:这里 ...
随机推荐
- 【转载】Android异步处理系列文章
本博文地址:http://blog.csdn.net/mylzc/article/details/6777767 转载请注明出处. 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把 ...
- 【BZOJ】【2809】【APIO2012】派遣dispatching
贪心/可并堆 跪了……我这么弱果然还是应该回家种红薯去…… 考虑选人的时候,每个人对答案的贡献其实是一样的,都是1,那么我们就贪心地去选花钱少的就好啦~ 具体的做法:倒着枚举(因为有b[i]<i ...
- offsetParent、offsetTop、offsetLeft、offsetWidth、offsetHeight
w3c规范,请戳这里:http://www.w3.org/TR/cssom-view/#dom-htmlelement-offsetparent 一.offsetParent 英文解读: part o ...
- Curse of Dimensionality
Curse of Dimensionality Curse of Dimensionality refers to non-intuitive properties of data observed ...
- AngularJs学习笔记--bootstrap
AngularJs学习笔记系列第一篇,希望我可以坚持写下去.本文内容主要来自 http://docs.angularjs.org/guide/ 文档的内容,但也加入些许自己的理解与尝试结果. 一.总括 ...
- 通过HTML条件注释判断IE版本的HTML语句详解<!--[if IE]> <![endif]-->
我们常常会在网页的HTML里面看到形如[if lte IE 9]……[endif]的代码,表示的是限定某些浏览器版本才能执行的语句,那么这些判断语句的规则是什么呢?请看下文: <!--[if ! ...
- Unity3D研究院之静态自动检查代码缺陷与隐患
原地址:原地址:http://www.xuanyusong.com/archives/2828 代码缺陷和代码错误的最大区别是,代码缺陷不影响游戏编译,而代码错误编译都不通过.但是代码缺陷会影响游戏发 ...
- tomcat 常见错误
1.启动时加载会话错误 Exception loading sessions from persistent storage 处理方法:删除tomcat对应的项目目录下 work/session.se ...
- codeforces 430A Points and Segments (easy)(理解能力有待提高……)
题目 //终于看懂题目了,,,, //一条线段里面不是每个坐标上都有要染色的点,所以为了满足条件,只能考虑那些给出坐标的点 //所以就要排序一下了,不能直接根据坐标0 1 0 1…… #include ...
- HDU 1465 不容易系列之一(错排,递归)
简而言之,就是把n个信封全部装错的可能数.(中问题,具体看题目) //当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示, //那么M(n-1)就表示n-1个编号元素放在 ...