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. Python——模块以及导入注意事项

    在Python中,每一个文件都应该是可以被导入的. 每一个独立的python文件都是一个模块 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍. 而在实际应用时,每个模块都是有专人负责独立开发 ...

  2. PIE_SDK.NET功能表

  3. 分分钟钟学会Python -基础&运算符

    day002 基础&运算符 1.循环语句 ### 1.循环格式 while 条件: print('') ''' while True: print('人生苦短,我用Python.') ''' ...

  4. 页面多个 swiper 互补冲突

    方法一:精简版 $(".swiper-container").each(function(){ $(this).swiper({ loop: true, initialSlide ...

  5. python设计模式--读书笔记

    GoF在其设计模式一书中提出了23种设计模式,并将其分为三类: 创建型模式 将对象创建的细节隔离开来,代码与所创建的对象的类型无关. 结构型模式 简化结构,识别类与对象间的关系,重点关注类的继承和组合 ...

  6. 一个数字键盘引发的血案——移动端H5输入框、光标、数字键盘全假套件实现

    https://juejin.im/post/5a44c5eef265da432d2868f6 为啥要写假键盘? 还是输入框.光标全假的假键盘? 手机自带的不用非得写个假的,吃饱没事干吧? 装逼?炫技 ...

  7. Class and Instance Variables In Ruby

    https://github.com/unixc3t/mydoc/blob/master/blog/caiv.md

  8. [H5表单]html5自带表单验证体验优化及提示气泡修改

    慕课网之前录制的视频,js/jquery各种宽高的理解和应用,最近终于上线了.还有一个html5左侧导航没有上线!最近慕课网系列课程让我录制一个html5表单验证的课程.今天就稍微说一下表单验证!另外 ...

  9. WebStorm 用法集合

    1. 图片宽高提示.&lt;img src="https://pic4.zhimg.com/8345475b687c83a71e0564419b0ac733_b.jpg" ...

  10. (转载).NET的五层架构

    我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经典的是三层架构,那么,什么是三层架构呢?它包括表现层,业务层,数据访问层:而对于一个新手来说,从抽象意义上的三层架构,逻辑上就划分为三个层 ...