UVALive 6948 Jokewithpermutation dfs

题目链接:UVALive 6948  Jokewithpermutation

题意:给一串数字序列,没有空格,拆成从1到N的连续数列。

dfs.

可以计算出N的值,也可以直接检验当前数组是否合法。

#include <stdio.h>
#include <iostream>
#include <string.h>
#define maxn 100
using namespace std;

char str[maxn];
int num[maxn];
bool vis[maxn];
int cnt;
int len;
int N;

bool ok = false;

bool dfs(int id, int pos) {
    if (ok) return false;
    if (pos == len && id == N) {
        cnt = id;
        ok = true;
        return true;
    }
    if (pos >= len) return false;

    num[id] = str[pos] - ‘0‘;
    if (num[id] >= 1 && num[id] <= N && !vis[num[id]]) {
        vis[num[id]] = 1;
        if (dfs(id+1, pos+1)) return true;
        //dfs(id+1, pos+1);
        vis[num[id]] = 0;
    }
    num[id] = (str[pos]-‘0‘)*10 + str[pos+1]-‘0‘;
     if (num[id] >= 1 && num[id] <= N && !vis[num[id]]) {
        vis[num[id]] = 1;
        if (dfs(id+1, pos+2)) return true;
        //dfs(id+1, pos+2);
        vis[num[id]] = 0;
    }
    return false;
}

int main() {
    //freopen("in.cpp", "r", stdin);
    while(~scanf("%s", str)) {
        ok = false;
        len = strlen(str);
        cnt = 0;
        N = (len>9?9:len)+(len>9?(len-9)/2:0);
        memset(vis, 0, sizeof(vis));
        dfs(0, 0);
        for (int i=0; i<cnt; ++i) {
            if (i == 0) printf("%d", num[i]);
            else printf(" %d", num[i]);
        }
        printf("\n");
    }
    return 0;
}

dfs要优雅...

时间: 2024-10-10 08:58:56

UVALive 6948 Jokewithpermutation dfs的相关文章

UVALive 6948 Jokewithpermutation 深搜

题意就是把一段序列拆成从1到n的形式 一开始暴力了一下 后来发现bug太多一定是思路不对…… #include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #include<string.h> #include<map> #include<vector> #include<queue> #define M(a,b) memse

Gym 100553J Jokewithpermutation(dfs)

题意:有n个数(n<=50)写在一行,将两数之间的空格去掉得到一个数字串.根据这个数字串回复原数: 思路:先求数的个数,当串长度小于10时,均为个位数:当串长度大于9时,存在两位数,剪去9个个位数,同样得到数的个数: 数的个数也是串中的最大数: 采用枚举的方法将每个数与串中的位置匹配,属于同一个数的数字对应同一个数: 输出时,两位数的数字间不加空格: #include<cstdio> #include<cstring> #include<algorithm> us

Cells UVALive - 3486(dfs序+手动开栈)

给一棵树,每次每次询问一个点是否是另一个点的祖先? 输入时是每个下标对应节点的儿子的数量 用dfs序 时间戳.. 如果一个点是另一个点的祖先,那么它的两个标记一定在祖先的范围之内 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector>

UVALive 6257 Chemist&#39;s vows --一道题的三种解法(模拟,DFS,DP)

题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有转移方程:dp[i] = (dp[i-1]&&f(i-1,1)) || (dp[i-2]&&f(i-2,2))     f(i,k):表示从i开始填入k个字符,这k个字符在不在元素周期表中.  dp[0] = 1 代码: //109ms 0KB #include <ios

UVALive - 6455 Stealing Harry Potter&#39;s Precious (bfs+dfs)

https://cn.vjudge.net/problem/UVALive-6455 题目大意:题目上给出一个地图,其中@是人在地图上的出发点,#是墙,' . '是路.然后给出几个点,这些点表示财宝的所在地.问人是否能够得到所有的宝藏,如果能够的话给出所有的宝藏的最短的路径. 解题思路:由于只有最多4个宝藏所在地,所以只要用bfs找出出发点和财宝所在地距离到达其他点的步数.因为最多只有4个宝藏,所以可以暴力找出出发点到所有宝藏的最短距离. 暴力代码: 1 #include<stdio.h> 2

UVALive 6663 Count the Regions --离散化+DFS染色

题意:给你n(n<=50)个矩形(左上角坐标和右下角坐标),问这些矩形总共将平面分成多少个部分.坐标值可能有1e9. 分析:看到n和坐标的范围,容易想到离散化,当时就没想到离散化以后怎么判断区域个数.后来看别人代码才知道,可以将边界上的点vis赋为1,那么枚举所有哈希后的平面上的点,遇到一个vis=0的点就从这点一直搜过去,搜到边界自动会停止了,因为边界vis=1,并且ans++,就可以了.真是太弱.. 代码: #include <iostream> #include <cstdi

DFS Gym 100553J Jokewithpermutation

题目传送门 1 /* 2 题意:将字符串分割成一个全排列 3 DFS:搜索主要在一位数和两位数的处理,用d1, d2记录个数,在不饱和的情况下,两种都试一下 4 DFS还是写不来,难道是在家里懒? 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 using namespace std; 11 12 const int MAXN

[UVALive 6663 Count the Regions] (dfs + 离散化)

链接:https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675 题目大意: 在一个平面上有 n (1<=n<=50) 个矩形.给你左上角和右下角的坐标(0<=x<=10^6, 0<=y<=10^6).问这些矩形将该平面划分为多少块. 解题思路: 因为n非常小,能够对整个图进行压缩.仅仅要不

UVALive 5844 dfs暴力搜索

题目链接:UVAive 5844 Leet DES:大意是给出两个字符串.第一个字符串里的字符可以由1-k个字符代替.问这两个字符串是不是相等.因为1<=k<=3.而且第一个字符串长度小于等于15.所以.对第一个字符串里的每一个字符尝试匹配1-k个字符看是否有可能相等就好了. 比赛的时候想到这是dfs类暴力,但是map<char, char*>没用过.不知道怎么记录了.而且dfs本身就不太会用.依然感觉dfs很奇妙. #include <iostream> #inclu