zoukankan      html  css  js  c++  java
  • uva 211(dfs)

    211 - The Domino Effect

    Time limit: 3.000 seconds

    A standard set of Double Six dominoes contains 28 pieces (called bones) each displaying two numbers
    from 0 (blank) to 6 using dice-like pips. The 28 bones, which are unique, consist of the following
    combinations of pips:
    Bone # Pips Bone # Pips Bone # Pips Bone # Pips
    1 0 | 0 8 1 | 1 15 2 | 3 22 3 | 6
    2 0 | 1 9 1 | 2 16 2 | 4 23 4 | 4
    3 0 | 2 10 1 | 3 17 2 | 5 24 4 | 5
    4 0 | 3 11 1 | 4 18 2 | 6 25 4 | 6
    5 0 | 4 12 1 | 5 19 3 | 3 26 5 | 5
    6 0 | 5 13 1 | 6 20 3 | 4 27 5 | 6
    7 0 | 6 14 2 | 2 21 3 | 5 28 6 | 6
    All the Double Six dominoes in a set can he laid out to display a 7 8 grid of pips. Each layout
    corresponds at least one map" of the dominoes. A map consists of an identical 7 8 grid with the
    appropriate bone numbers substituted for the pip numbers appearing on that bone. An example of a
    7 8 grid display of pips and a corresponding map of bone numbers is shown below.
    7 x 8 grid of pips map of bone numbers
    6 6 2 6 5 2 4 1 28 28 14 7 17 17 11 11
    1 3 2 0 1 0 3 4 10 10 14 7 2 2 21 23
    1 3 2 4 6 6 5 4 8 4 16 25 25 13 21 23
    1 0 4 3 2 1 1 2 8 4 16 15 15 13 9 9
    5 1 3 6 0 4 5 5 12 12 22 22 5 5 26 26
    5 5 4 0 2 6 0 3 27 24 24 3 3 18 1 19
    6 0 5 3 4 2 0 3 27 6 6 20 20 18 1 19
    Write a program that will analyze the pattern of pips in any 78 layout of a standard set of dominoes
    and produce a map showing the position of all dominoes in the set. If more than one arrangement of
    dominoes yield the same pattern, your program should generate a map of each possible layout.
    Input
    The input le will contain several of problem sets. Each set consists of seven lines of eight integers
    from 0 through 6, representing an observed pattern of pips. Each set is corresponds to a legitimate
    con guration of bones (there will be at least one map possible for each problem set). There is no
    intervening data separating the problem sets.
    Output
    Correct output consists of a problem set label (beginning with Set #1) followed by an echo printing of
    the problem set itself. This is followed by a map label for the set and the map(s) which correspond to
    the problem set. (Multiple maps can be output in any order.) After all maps for a problem set have
    been printed, a summary line stating the number of possible maps appears.
    At least three lines are skipped between the output from different problem sets while at least one
    line separates the labels, echo printing, and maps within the same problem set.
    Note: A sample input le of two problem sets along with the correct output are shown.
    Sample Input
    5 4 3 6 5 3 4 6
    0 6 0 1 2 3 1 1
    3 2 6 5 0 4 2 0
    5 3 6 2 3 2 0 6
    4 0 4 1 0 0 4 1
    5 2 2 4 4 1 6 5
    5 5 3 6 1 2 3 1
    4 2 5 2 6 3 5 4
    5 0 4 3 1 4 1 1
    1 2 3 0 2 2 2 2
    1 4 0 1 3 5 6 5
    4 0 6 0 3 6 6 5
    4 0 1 6 4 0 3 0
    6 5 3 6 2 1 5 3
    Sample Output
    Layout #1:
    5 4 3 6 5 3 4 6
    0 6 0 1 2 3 1 1
    3 2 6 5 0 4 2 0
    5 3 6 2 3 2 0 6
    4 0 4 1 0 0 4 1
    5 2 2 4 4 1 6 5
    5 5 3 6 1 2 3 1
    Maps resulting from layout #1 are:
    6 20 20 27 27 19 25 25
    6 18 2 2 3 19 8 8
    21 18 28 17 3 16 16 7
    21 4 28 17 15 15 5 7
    24 4 11 11 1 1 5 12
    24 14 14 23 23 13 13 12
    26 26 22 22 9 9 10 10
    There are 1 solution(s) for layout #1.
    Layout #2:
    4 2 5 2 6 3 5 4
    5 0 4 3 1 4 1 1
    1 2 3 0 2 2 2 2
    1 4 0 1 3 5 6 5
    4 0 6 0 3 6 6 5
    4 0 1 6 4 0 3 0
    6 5 3 6 2 1 5 3
    Maps resulting from layout #2 are:
    16 16 24 18 18 20 12 11
    6 6 24 10 10 20 12 11
    8 15 15 3 3 17 14 14
    8 5 5 2 19 17 28 26
    23 1 13 2 19 7 28 26
    23 1 13 25 25 7 4 4
    27 27 22 22 9 9 21 21
    16 16 24 18 18 20 12 11
    6 6 24 10 10 20 12 11
    8 15 15 3 3 17 14 14
    8 5 5 2 19 17 28 26
    23 1 13 2 19 7 28 26
    23 1 13 25 25 7 21 4
    27 27 22 22 9 9 21 4
    There are 2 solution(s) for layout #2.

    dfs的暴力题,注意输出格式控制,这里容易wa。

    题目大意:给出一些7*8的矩阵,每两个相邻的数字可以表示一个骨牌,问说骨牌有多少种摆法。

    解题思路:dfs枚举每一个位置,考虑当前位置和下面或右边组成的骨牌,直到所有位置都已安放好骨牌,则为一种方案。

    #include <cstdio>
    #include <iostream>
    #include <sstream>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    #include <queue>
    #include <stack>
    #include <algorithm>
    using namespace std;
    #define ll long long
    #define _cle(m, a) memset(m, a, sizeof(m))
    #define repu(i, a, b) for(int i = a; i < b; i++)
    #define repd(i, a, b) for(int i = b; i >= a; i--)
    #define sfi(n) scanf("%d", &n)
    #define pfi(n) printf("%d
    ", n)
    #define sfi2(n, m) scanf("%d%d", &n, &m)
    #define pfi2(n, m) printf("%d %d
    ", n, m)
    #define pfi3(a, b, c) printf("%d %d %d
    ", a, b, c)
    #define MAXN 105
    #define R 6
    #define C 7
    const int INF = 0x3f3f3f3f;
    const int dir[][2] = {{1, 0}, {0, 1}};
    int vis[7][8];
    int mp[7][8];
    int tot = 0;
    int d[7][7];
    int hv[29];
    int kase = 0;
    int maxn;
    
    void get()
    {
        int t = 1;
        repu(i, 0, 7)
        repu(j, i, 7)  d[j][i] = d[i][j] = t++;
    }
    
    void put1()
    {
        printf("Layout #%d:
    
    ", kase);
        repu(i, 0, 7)
        {
            repu(j, 0, 8) printf("%4d", mp[i][j]);
            puts("");
        }
        puts("");
    }
    
    void put2()
    {
        repu(i, 0, 7)
        {
            repu(j, 0, 8)
            printf("%4d", vis[i][j]);
            puts("");
        }
        puts("");
    }
    
    bool Judge(int x, int y)
    {
        if(x >= 0 && x <= R && y >= 0 && y <= C) return true;
        return false;
    }
    
    void dfs(int x, int y)
    {
        if(x > R)
        {
            tot++;
            put2();
        }
        else if(vis[x][y])
        {
            int dx = x;
            int dy = y + 1;
            if(dy > C)
            {
                dx++;
                dy = 0;
            }
            dfs(dx, dy);
        }
        else
        {
            repu(i, 0, 2)
            {
                int dx = x + dir[i][0];
                int dy = y + dir[i][1];
                int t, t1, t2;
                t1 = mp[x][y];
                t2 = mp[dx][dy];
                t = d[t1][t2];
                if(Judge(dx, dy) && !hv[t] && !vis[dx][dy])
                {
                    vis[dx][dy] = vis[x][y] = t;
                    hv[t] = 1;
                    int tx = x, ty = y + 1;
                    if(ty > C) tx++, ty = 0;
                    dfs(tx, ty);
                    vis[dx][dy] = vis[x][y] = 0;
                    hv[t] = 0;
                }
            }
        }
        return ;
    }
    
    int main()
    {
        get();
        while(~sfi(mp[0][0]))
        {
            repu(i, 0, 7)
            repu(j, 0, 8)
            if(i || j) sfi(mp[i][j]);
            _cle(vis, 0);
            _cle(hv, 0);
            tot = 0;
            maxn = 0;
            if(kase) printf("
    
    
    ");
            kase++;
            put1();
            printf("Maps resulting from layout #%d are:
    
    ", kase);
            dfs(0, 0);
            printf("There are %d solution(s) for layout #%d.
    ", tot, kase);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    逆向入门之路1 关于逆向工程
    EC笔记:第三部分:14、在资源管理类中小心Copying行为
    vuex最简单、最详细的入门文档
    前端加密的几种常见方式
    NAS星云链 入门之从零开发第一个DAPP
    chrome 不支持12px以下字体为题的解决
    input checkbox 多选 验证
    你对javascript的原生操作或者工具了解多少呢?
    ionic2-键盘覆盖输入框和返回键问题解决方案
    ionic2 手风琴效果
  • 原文地址:https://www.cnblogs.com/sunus/p/4783075.html
Copyright © 2011-2022 走看看