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自动化day3-函数、递归、内置函数

    一.什么是函数 修理工===>程序员 具备某一功能的工具===>函数 要想使用工具,需要事先准备好,然后拿来就用且可以重复使用要想用函数,需要先定义,再使用 二.函数基础 1.函数分类 # ...

  2. python web开发小结

    书籍 <python基础教程> <流畅的python> web框架 flask django tornado ORM sqlalchemy orator 消息队列 celery ...

  3. 关于DES加密

    数据加密算法(Data Encryption Algorithm,DEA)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DEA是嵌入硬件中的.通常,自动取款 ...

  4. 构造函数与普通函数关于“new”操作符

    javascript中构造函数与普通函数的区别还有关于“new”操作符的一些原理   有一种创建对象的方法叫做工厂模式,例如: 1 function person(name,age){ 2 var o ...

  5. SQL数据库正在恢复 查看进度

    在使用SQL的过程中.. 开启一个事务..进行大计算量..在中间出错或者强制杀死SQL服务进程..总之事务没有提交.. 再次开启时sql会进入自动检查的过程.. 数据库小的话问题不大..会比较快.. ...

  6. JAVA学习3:Eclipse中集成Tomcat

    问题: 很多时候在Eclipse中启动Tmocat后,不能访问本机的localhost:8080主页,并且其他项目也不能访问. 原因: 打开Tomcat下的webapp后也找补到项目目录,这是因为Ec ...

  7. Oracle PL/SQL编程之基础

    1.简介:pl/sql块由三个部分组成:定义部分.执行部分.例外处理部分,如下所示: declare: /*定义部分---定义常量.变量.游标.例外.复杂数据类型 begin /*执行部分---要执行 ...

  8. LR自我总结的问题

    1.Controller中添加负载测试时,最后运行完提示the following graph s were not created.导致最后没有数据报表生成. 解决方法:在result中将auto ...

  9. Mutex,Monitor,lock,MethodImplAttribute,SynchronizedAttribute的用法差异

    1)Mutex:进程之间的同步(互斥量). 2)lock/Monitor……:线程同步.其中lock是Monitor的简化版本(直接生成try{Monitor.Enter(……)}finally{Mo ...

  10. 入门系列之在Ubuntu上使用Netdata设置实时性能监控

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由小翼 发表于云+社区专栏 介绍 Netdata通过可扩展的Web仪表板提供准确的性能监控,可以显示Linux系统上的流程和服务.它监控 ...