10067 - Playing with Wheels

题目页:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008

从一开始思路就不对,之后才焕然大悟……每次都是这样。

还有,感觉搜索和图遍历有点分不清呢。

在第63行加入

 if (u == target)
return;

可以提速很多,可以从300ms左右降低到100ms以内。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <queue>
 
#define Dec true
#define Inc false
 
int  start;      // 开始数值
int  target;     // 目标数值
bool op[4];      // 4 个转盘的操作
int  ban_number; // 禁止数的个数
int  ban[10001]; // 记录禁止数的数组
 
struct
{
    int  parent;
    bool used;
} buffer[10001]; // 顶点
 
// 增大数值
void decrease(int current[], int i)
{
    current[i]--;
 
    if (current[i] == -1)
        current[i] = 9;
}
 
// 减小数值
void increase(int current[], int i)
{
    current[i]++;
 
    if (current[i] == 10)
        current[i] = 0;
}
 
// 广度优先搜索
void bfs()
{
    std::queue<int> q;
 
    // 初始化顶点
    for (int i = 0; i < 10000; i++)
    {
        buffer[i].parent = -1;
        buffer[i].used = false;
    }
 
    // 把禁止数标记为已发现
    for (int i = 0; i < ban_number; i++)
    {
        buffer[ban[i]].used = true;
    }
 
    // 初始化开始节点
    buffer[start].used = true;
    q.push(start);
 
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
 
        int depart[4];
        int a = u / 1000;
        int b = (u - a*1000) / 100;
        int c = (u - a*1000 - b *100) / 10;
        int d = (u - a*1000 - b *100 - c *10);
        depart[0] = a;
        depart[1] = b;
        depart[2] = c;
        depart[3] = d;
 
        for (int i = 0; i < 4; i++)
        {
            decrease(depart, i);
            {
                int x = depart[0] * 1000 + depart[1] * 100 + depart[2] * 10 + depart[3];
                if (buffer[x].used == false)
                {
                    buffer[x].parent = u;
                    buffer[x].used = true;
                    q.push(x);
                }
            }
            increase(depart, i);
 
            increase(depart, i);
            {
                int x = depart[0] * 1000 + depart[1] * 100 + depart[2] * 10 + depart[3];
                if (buffer[x].used == false)
                {
                    buffer[x].parent = u;
                    buffer[x].used = true;
                    q.push(x);
                }
            }
            decrease(depart, i);
        }
    }
}
 
// 读取四个个位数组成一个四位数,并返回这个四位数
int read4()
{
    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    return a * 1000 + b *100 + c * 10 + d;
}
 
// main
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        start  = read4();
        target = read4();
 
        scanf("%d", &ban_number);
        for (int j = 0; j < ban_number; j++)
        {
            ban[j] = read4();
        }
 
        bfs();
 
        {
            int x = target;
            int steps = 0;
            while(x != -1 && x != start)
            {
                steps++;
                x = buffer[x].parent;
            }
 
            if (x == start)
                printf("%d\n", steps);
            else
                printf("-1\n");
        }
    }
 
    return 0;
}

[uva] 10067 - Playing with Wheels的更多相关文章

  1. uva10067 Playing with Wheels 【建图+最短路】

    题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...

  2. UVA 1482 - Playing With Stones(SG打表规律)

    UVA 1482 - Playing With Stones 题目链接 题意:给定n堆石头,每次选一堆取至少一个.不超过一半的石子,最后不能取的输,问是否先手必胜 思路:数值非常大.无法直接递推sg函 ...

  3. UVa - 11283 - PLAYING BOGGLE

    先上题目 Problem F PLAYING BOGGLE Boggle® is a classic word game played on a 4 by 4 grid of letters. The ...

  4. uva 1482 - Playing With Stones

    对于组合游戏的题: 首先把问题建模成NIM等经典的组合游戏模型: 然后打表找出,或者推出SG函数值: 最后再利用SG定理判断是否必胜必败状态: #include<cstdio> #defi ...

  5. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  6. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  7. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  8. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  9. (转) Deep Reinforcement Learning: Playing a Racing Game

    Byte Tank Posts Archive Deep Reinforcement Learning: Playing a Racing Game OCT 6TH, 2016 Agent playi ...

随机推荐

  1. Laravel 视图调用model方法

    首先控制器 model 视图

  2. rabbitmq 消息确认

    消息确认主要用在接收方 如果接收方没有确认, broker可以重发,确保消息至少消息一次..

  3. HTTP请求的常用方法有哪些

    HTTP请求的常用方法有:GET方法.POST方法.HEAD方法.PUT方法.DELETE方法.CONNECT方法.OPTIONS方法.TRACE方法.下面本篇文章就给大家介绍具体介绍一下HTTP请求 ...

  4. 2019.04.18 读书笔记 深入string

    整个.net中,最特殊的就是string类型了,它有着引用类型的特性,又有着值类型的操作方式,最特殊的是,它还有字符串池,一个字符串只会有一个实例(等下就推翻!). 鉴于之前的<==与Equal ...

  5. Revit二次开发_快速显示隐藏剖面框

    最近遇到一种状况需要经常切换剖面框的可见性,于是想将剖面框的显示与隐藏做成一个按钮,方便切换. 其他类似元素想做成快速切换可见性应该可以使用类似做法. 这次的隐藏对象是剖面框,所以我直接就隐藏元素了. ...

  6. ios 开发之旅

    你可能还在跟我一样傻傻的研究,怎么用visual studio 开发ios 里,哪就浪费时间吧!因为在安装 xmarin的时候,自动可以选择ios for Visual studio ,安装完也不能编 ...

  7. 案例25-servlet的抽取

    1 product模块的抽取版本一 1 ProductServlet代码 抽取之后,原来对应的IndexServlet,ProductListByCidServlet等都可以删除.对应的web.xml ...

  8. 【Css】一个简单的图片库

    今天做一个简单的图片库! 其实这个在w3school教程里介绍得很好了,不过看到什么,自己动手做一次,记得也深刻不是. 我们分几步来走: 第一步:先写一个坯子. <html> <he ...

  9. unity小地图上的动态图标

    unity制作小地图简单,用rawImage 再来个摄像机就行 但是现在一个需求就是地图上一些东西要加上图标,图标会随着地图物体的移动而移动 然后去网上下载了个小地图插件  UGUI MiniMap( ...

  10. CountDownLatch同步工具--控制多个线程执行顺序

    好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行. java.util.concurrent.CountDownLatch ...