• 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
  • 相关阅读:
    angular 个人零点学习
    angularjs 五大关键点
    OA项目学习总结
    oa
    时间插件
    angular js模态框
    搜索
    xianduanshu
    o-o
    paibingbuzhen
  • 原文地址:https://www.cnblogs.com/sunus/p/4783075.html
Copyright © 2020-2023  润新知