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)的更多相关文章

  1. ACM学习历程—ZOJ 3861 Valid Pattern Lock(dfs)

    Description Pattern lock security is generally used in Android handsets instead of a password. The p ...

  2. DFS+模拟 ZOJ 3861 Valid Pattern Lock

    题目传送门 /* 题意:手机划屏解锁,一笔连通所有数字,输出所有可能的路径: DFS:全排列 + ok () 判断函数,去除一些不可能连通的点:) */ #include <cstdio> ...

  3. ZOJ 3861 - Valid Pattern Lock

    3861 - Valid Pattern Lock Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & ...

  4. ZOJ - 3861 Valid Pattern Lock 【全排列】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3861 思路 先生成全排列,然后判断哪些情况不符合的,剔除就好了 ...

  5. 浙江大学2015年校赛B题 ZOJ 3861 Valid Pattern Lock

    这道题目是队友写的,貌似是用暴力枚举出来. 题意:给出一组数,要求这组数在解锁的界面可能的滑动序列. 思路:按照是否能够直接到达建图,如1可以直接到2,但是1不能直接到3,因为中间必须经过一个2. 要 ...

  6. Valid Pattern Lock(dfs + 暴力)

    Valid Pattern Lock Time Limit: 2 Seconds      Memory Limit: 65536 KB Pattern lock security is genera ...

  7. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  8. ZOJ Problem Set - 1025解题报告

    ZOJ Problem Set - 1025 题目分类:基础题 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=10 ...

  9. ZOJ Problem Set - 2563 Long Dominoes 【如压力dp】

    称号:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形.求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的.比較火.链接:这里 ...

随机推荐

  1. Memcached使用

    一.Memcached简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网 ...

  2. hdu 1853 Cyclic Tour 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 There are N cities in our country, and M one-way ...

  3. 【BZOJ】【3166】【HEOI2013】Alo

    可持久化Trie+set Orz zyf…… 搞区间中次大值不好搞,那么我们就反过来,找一个数,然后看它在哪些区间里是次大值…… (然而事实上我们并不用真的把这个区间具体是什么找见,只要知道它可以跟哪 ...

  4. Matlab设置网格线密度(坐标精度)

    1.不精确 set(gca,'XMinorTick','on') 这样的话知识x轴显示了细的密度,网格线并没有变. 2.精确 set(gca,'xtick',-1:0.1:1); set(gca,'y ...

  5. wifidog源码分析 - 初始化阶段

    Wifidog是一个linux下开源的认证网关软件,它主要用于配合认证服务器实现无线路由器的认证放行功能. wifidog是一个后台的服务程序,可以通过wdctrl命令对wifidog主程序进行控制. ...

  6. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  7. JAVA WEB新进展

    哈哈,终于搞来页面来了,丑是丑,但是好的进展. 高手的思路,自己用库建连接池,确实利害. 最关键的一个HELPER代码: package org.smart4j.chapter2.helper; im ...

  8. 安装Genymotion android模拟器

    Genymotion优点: 速度快性能好,资源占用低,系统要求512MB内存就能运行 支持 OpenGL 3D加速,可以流畅玩大型3D游戏 支持同时启动多个模拟器,可以实现软件或游戏多开 支持多种虚拟 ...

  9. Install wxWidgets-3.0.2 on GNU/Linux Debian

    转载自 http://www.binarytides.com/install-wxwidgets-ubuntu/ wxWidgets wxWidgets is an application devel ...

  10. lintcode:打劫房屋

    题目 打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动 ...