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. SD341X-SD343H蜗轮传动伸缩蝶阀厂家,SD341X-SD343H蜗轮传动伸缩蝶阀价格 - 专题栏目 - 无极资讯网

    无极资讯网 首页 最新资讯 最新图集 最新标签   搜索 SD341X-SD343H蜗轮传动伸缩蝶阀 无极资讯网精心为您挑选了(SD341X-SD343H蜗轮传动伸缩蝶阀)信息,其中包含了(SD341 ...

  2. UGUI优化总结

    1.动静分离 canvas下元素变化时,会使整个canvas重新绘制.因此将ui经常改变和不怎么改变的部分分离,分别使用不同的canvas. 2.图集优化 不同界面的ui,可以打包成不同的图集,一些公 ...

  3. SQL Server触发器创建、删除、修改、查看

    一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二:SQL Server为每个触发器都创 ...

  4. Oracle Net Configuration(监听程序和网络服务配置)

    1.在Oracle服务端和客户端都安装完之后,就需要配置监听程序和本地网络服务,以便外部程序和工具的访问,所以Oracle提供了两款自带的工具来配置它们分别是 Net Configuration.Ne ...

  5. centos 7编译安装nginx

    一.安装nginx时必须先安装相应的编译工具yum -y install gcc gcc-c++ autoconf automakeyum -y install zlib zlib-devel ope ...

  6. ios 开发之旅

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

  7. Cloudera Manager集群官方默认的各个组件开启默认顺序(图文详解)

    不多说,直接上干货! 如下是 Cloudera Manager集群官方默认的各个组件开启默认顺序. http://192.168.80.31:7180/cmf/clusters/1/express-a ...

  8. 转 功能强大的shell:if条件语句

    原文 http://blog.zol.com.cn/2322/article_2321767.html 功能强大的shell:if条件语句 if语句测试条件,测试条件返回真(0)或假(1)后,可相应执 ...

  9. ORA-XXXX错误集合

    第一.ORA-12514:listener does not currently know of service requested in connect descriptor 监听器巴拉巴拉一堆,然 ...

  10. vi 中插入当前时间

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...