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的.比較火.链接:这里 ...
随机推荐
- Eclipse : cannot open output file(c++)
之前电脑卡的时候 强制关闭Eclipse,结果打开再次运行的时候却不能输出了:找了网上的原因,是之前那个进程还未关闭 开发环境 Eclipse for C/C++ & MinGW Er ...
- 【CentOS】设置静态IP
问题描述: CentOS配置静态IP 问题解决: (1)修改IP--修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth ...
- bzoj 3295 树套树
比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理 出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多 /******************** ...
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
org.springframework.dao.TransientDataAccessResourceException: ### Error updating database. Cause: ja ...
- Ruby探针的基本实现原理
李哲 - MAY 13, 2015 语言本身 Ruby语言支持语法级别的系统,框架,甚至语言本身的方法复写,一般叫做元编程(meta programming), 此基础之上还有一些术语为mixin,方 ...
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...
- Android的事件处理机制详解(二)-----基于监听的事件处理机制
基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...
- 神器——Chrome开发者工具(一)
这里我假设你用的是Chrome浏览器,如果恰好你做web开发,或者是比较好奇网页中的一些渲染效果并且喜欢折腾,那么你一定知道Chrome的开发者工具了.其实其他浏览器也有类似工具,比如Firefox下 ...
- C# 和Jsonp的一个小demo 用jQuery与JSONP轻松解决跨域访问的问题
客服端: 在A项目下面 建立一个 JsonpClient.aspx页面,代码如下: <%@ Page Language="C#" AutoEventWireup=& ...
- js小技巧(一)
事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcE ...