RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-204038

Rennorb's questions

Martin Hope
Rennorb
Asked: 2022-07-12 18:46:27 +0000 UTC

是否有可能以某种方式加速 Dijkstra 算法的实现?

  • 0

我对“graph”类的实现,PathWeights方法实现了 Dijkstra 的有向加权图算法:

const int HUGE_NUMBER = 100000000; //

typedef std::pair<int, uint64_t> Arrow;

bool ArrowCmp(const Arrow &lhs, const Arrow &rhs) {
  return lhs.first < rhs.first;
}

class Graph {
  int size_;

  std::vector<std::vector<Arrow>> arrows;
  std::vector<int> parents;

 public:
  explicit Graph(int size) {
    size_ = size;
    arrows.resize(size);
    parents.resize(size);
  }

  void AddEdge(int from, int to, uint64_t cost) {
    if (from == to) {
      return;
    }

    auto arrow = std::make_pair(to, cost);

    auto pos = std::lower_bound(arrows[from].begin(),
                                arrows[from].end(),
                                arrow,
                                ArrowCmp);

    if (pos == arrows[from].end()) {
      arrows[from].push_back(arrow);
    } else if (pos->first != arrow.first) {
      arrows[from].insert(pos, arrow);
    } else {
      (*pos).second = std::min(cost, pos->second);
    }
  }

  std::vector<int> Path(int from, int to) {
    PathWeights(from);

    std::vector<int> ret;

    for (int cv = to; cv != from; cv = parents[cv]) {
      ret.push_back(cv);
    }

    ret.push_back(from);
    std::reverse(ret.begin(), ret.end());

    return ret;
  }

  std::vector<uint64_t> PathWeights(int start) {
    std::vector<uint64_t> lens(size_);

    std::fill(lens.begin(), lens.end(), HUGE_NUMBER);
    lens[start] = 0;

    int count = 0;

    std::set<std::pair<uint64_t, int>> sorted_ps;

    sorted_ps.insert(std::make_pair(0, start));

    while (!sorted_ps.empty()) {
      int from = sorted_ps.begin()->second;
      sorted_ps.erase(sorted_ps.begin());

      for (int to = 0; to < size_; ++to) {
        auto arrow = std::make_pair(to, 0ul);
        auto pos = std::lower_bound(arrows[from].begin(),
                                    arrows[from].end(),
                                    arrow,
                                    ArrowCmp);

        if (pos == arrows[from].end()) {
          continue;
        }

        if (pos->first != to) {
          continue;
        }

        auto cost = pos->second;

        if (lens[from] + cost < lens[to]) {
          sorted_ps.erase(std::make_pair(lens[to], to));
          lens[to] = lens[from] + cost;
          parents[from] = to;
          sorted_ps.insert(std::make_pair(lens[to], to));
        }
      }
      ++count;
    }

    return lens;
  }
};

我正在尝试从封闭式比赛中解决问题,问题的条件可以表述如下:

  1. 给定一个可以有环和多条边的有向加权图
  2. 权重是从零到二的整数
  3. 顶点少于 5000,边少于 20000
  4. 找到两个给定顶点之间最简单路径的权重
  5. Main对 PathWeights 的调用不超过 10000次
  6. 程序应使用不超过 64Mb 的内存,运行不超过 3 秒

现在程序可以正常工作,但速度很慢。

第一个解决方案将边存储为邻接矩阵,并使用布尔数组通过线性搜索来搜索合适的顶点。现在我正在使用传出边的向量,按升序结束顶点索引排序,并设置为选择适当的顶点。有没有其他方法可以加快这个解决方案?在这些条件下是否值得使用另一种算法?

c++
  • 2 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2022-01-11 03:24:19 +0000 UTC

IDE 指示类型注释中的错误,但代码可以正常工作

  • 1

有一段与此等效的正确工作代码:

from typing import Optional


class Game:
    pass


def select(game: Game) -> Optional[Game]:
    vs: list[Game] = []
    next_games: list[list[Game, int]] = [[v, 0] for v in vs]

    if not next_games:
        return None

    next_games[0][1] = 0 # Тут

    return next_games[0][0]

PyCharm 对着标记线发誓,报错

意外类型:(int, int)可能的类型:(int, Game)(slice, Iterable[Game])

告诉我这意味着什么以及如何解决它。

python
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-03-14 04:40:24 +0000 UTC

.pycs 是如何组织的?

  • 7

你好!假设我们有以下代码:

x = 10

您需要获取与其对应的字节码。
让我们尝试编译它:

from dis import dis
dis('x=10')

我们得到:

  1           0 LOAD_CONST               0 (10)
              2 STORE_NAME               0 (x)
              4 LOAD_CONST               1 (None)
              6 RETURN_VALUE

或者,像这样(几乎相同):

from dis import Bytecode
bc = Bytecode('x=10')
list(bc.codeobj.co_code)
[100, 0, 90, 0, 100, 1, 83, 0]

在最后一个字节码中,有关常量的信息丢失了,尽管有LOAD_CONST(100)。

让我们尝试编译文件compileall:

>> python -m compileall ./
Listing './'...
Compiling './set.py'...

我们得到:

00 00 00 00 00 00 00 00 00 01 00 00 00 40 00 00
00 73 08 00 00 00 64 00 5A 00 64 01 53 00 29 02    
E9 0A 00 00 00 4E 29 01 DA 01 78 A9 00 72 03 00   
00 00 72 03 00 00 00 FA 08 2E 2F 73 65 74 2E 70
79 DA 08 3C 6D 6F 64 75 6C 65 3E 01 00 00 00 73    
00 00 00 00  

我在这段代码中找不到前一个。

这怎么解释?
一般来说,在哪里可以尊重它是如何安排的.pyc?

我想为 Python 编写自己的小型 VM。

python
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-01-05 14:17:13 +0000 UTC

无法将用于查找图中所有路径的递归算法转换为迭代算法

  • 0

你好!有一个递归函数可以找到图中的所有路径:

func (this *Graph) FindPath(from Word, to Word, visited Dict, current Path) {
    if from.Eq(to) {
        if len(current) > this.Max {
            this.Max = len(current)
            fmt.Println(current)
        }

        this.Pathes = append(this.Pathes, current)
        return
    }

    if visited.Index(from) != -1 {
        return
    }

    index := this.nodes.Index(from)

    if index == -1 {
        return
    }

    for r := 0; r < len(this.rules); r++ {
        index := from.Index(this.rules[r].Pat)

        if index == -1 {
            continue
        }

        vis := make(Dict, len(visited))
        copy(vis, visited)
        vis = append(vis, from)

        cur := make(Path, len(current))
        copy(cur, current)
        cur = append(cur, this.rules[r])

        this.FindPath(from.ApplyRule(this.rules[r]), to, vis, cur)
    }
}

我试图让它迭代:

func (this *Graph) FindPathes(from Word, to Word) {
    this.Pathes = make([]Path, 0)
    this.Max = 0

    nodes := stack.New()
    pathes := stack.New()
    visiteds := stack.New()

    nodes.Push(from)
    visiteds.Push(Dict{from})
    pathes.Push(make(Path, 0))

    for nodes.Len != 0 {
        curn := nodes.Pop().(Word)
        curp := pathes.Pop().(Path)
        curv := visiteds.Pop().(Dict)

        if curn.Eq(to) {
            if len(curp) > this.Max {
                this.Max = len(curp)
                fmt.Println(curp.ApplyVerbose(from))
            }

            this.Pathes = append(this.Pathes, curp)
            continue
        }

        for r := 0; r < len(this.rules); r++ {
            index := curn.Index(this.rules[r].Pat)

            if index == -1 {
                continue
            }

            newword := curn.ApplyRule(this.rules[r])

            if curv.Index(newword) != -1 {
                continue
            }

            newp := make(Path, len(curp))
            copy(newp, curp)
            newp = append(curp, this.rules[r])

            newv := make(Dict, len(curv))
            copy(newv, curv)
            newv = append(newv, newword)

            pathes.Push(newp)
            nodes.Push(newword)
            visiteds.Push(newv)
        }
    }
}

stack - 堆栈的自写实现,假设一切都在那里正常工作。

单词-[]int
字典-[]Word
路径-[]Rule
规则-struct{Pat Word, Rep Word}

Index - 用于Dict并Path返回所需元素的索引(或 -1),以及 for Word- 子字符串开始的位置(或 -1)。

Word.Eq - 检查两个单词是否相等。

第一个函数正常工作,但第二个函数没有在合理的时间内完成。你可以帮帮我吗?

алгоритм
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-12-30 01:12:24 +0000 UTC

尝试从两个不同位置打印对象时的不同输出

  • 1

你好!有一个图,其中节点是单词(类型Word),边缘是将一个单词转换为另一个单词的替换。
例如:节点123和之间333有一条边12->33。

有一种方法可以查找从一个单词到另一个单词的所有路径并将它们存储在this.Path中:

func (this *Graph) FindPath(from Word, to Word, visited Dict, current Path) {
    if from.Eq(to) {
        if len(this.Pathes) == 0 {
            fmt.Println(current)
        }

        this.Pathes = append(this.Pathes, current)
        return
    }

    if visited.Index(from) != -1 { // если уже были в этом узле
        return
    }

    index := this.nodes.Index(from)

    if index == -1 {
        return
    }

    for r := 0; r < len(this.rules); r++ {
        index := from.Index(this.rules[r].Pat)

        if index == -1 {
            continue
        }

        this.FindPath(from.ApplyRule(this.rules[r]), to, append(visited, from), append(current, this.rules[r]))
    }

    return
}

此方法完成后,this.Path将包含有效和无效路径。将此行添加到main:

fmt.Println(g.Pathes[0])

并与FindPath方法的第 4 行的输出进行比较。我们得到:

[{[1 0 1] [0]} {[0] [1]} {[1] [1 0]} {[1 0] [1 1]}]   // FindPath, правильный путь
[{[1 0 1] [0]} {[0] [1]} {[1] [1 0]} {[1 0] [1 1 1]}] // main

你可以帮帮我吗?我可以发布更多代码,但在我看来,错误就在这里。

алгоритм
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-07-31 07:20:50 +0000 UTC

<classname> 没有命名类型

  • -2

你好!

有一段代码:

房间.h

#ifndef ROOM_H
#define ROOM_H

#include <vector>
#include <cstdlib>
#include "point.h"

using std::vector;

class Room
{
private:
    int x;
    int y;

    int width;
    int height;
    vector<Point> points();

public:
    bool intersects(Room other);
    int area();

    Room(int x_, int y_, int w, int h);
    Room(){;}
    Room(const Room &base){(*this) = base;}


    static Room random(int fWidth, int fHeight, int maxWidth, int maxHeight, int minWidth, int minHeight);
    friend bool operator==(Room a, Room b);
    Room operator=(const Room &base);
};

#endif

点.h

#ifndef POINT_H
#define POINT_H

class Point
{
public:
    int x;
    int y;

    Point(int x_, int y_)
    {
        x = x_;
        y = y_;
    }

    Point()
    {
        ;
    }
};

#endif

迷宫.h

#ifndef MAZE_H
#define MAZE_H

#include <vector>
#include "room.h"

using std::vector;

enum Cell
{
    Empty,
    Room,
    Path
};

class Maze
{
    Cell *field;
    bool *fog;

    int width;
    int height;
    int area;

    void putRooms(int count);

    vector<Room> rooms;

public:
    Maze(int w, int h);
    void print(){}
};

#endif

尝试编译时,编译器会生成:

In file included from main.cpp:2:0:
maze.h:27:13: error: type/value mismatch at argument 1 in template parameter lis
t for 'template<class _Tp, class _Alloc> class std::vector'
  vector<Room> rooms;
             ^
maze.h:27:13: note:   expected a type, got 'Room'
maze.h:27:13: error: template argument 2 is invalid
In file included from maze.cpp:1:0:
maze.h:27:13: error: type/value mismatch at argument 1 in template parameter lis
t for 'template<class _Tp, class _Alloc> class std::vector'
  vector<Room> rooms;
             ^
maze.h:27:13: note:   expected a type, got 'Room'
maze.h:27:13: error: template argument 2 is invalid

同时,如果紧接着vector<Rooms> rooms;在maze.h中声明

Point x;
vector<Point> y;

没有更多的错误。

您能否解释一下 和 之间的编译器有什么区别Point,Room以及如何编译代码?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-07-19 06:19:29 +0000 UTC

内存分配错误(重新锁定)

  • 1

你好!现在我正在尝试用 C 编写一个 roguelike,同时我正在处理内存(非常有趣,在 python 和 sharpe 之后)。

有这样一段代码:
field- “二维”数组,里面存放的是迷宫
width和height,我想,
sizeret返回的点数组的长度是可以理解的

point *find_connectors(char *field, int width, int height, int *sizeret)
{
    point *ret;
    int size = 0;

    for(int x = 0; x<width; x++)
        for(int y = 0; y<height; y++)
        {
            char upper  = get(x, y+1, field, width, height);
            char bottom = get(x, y-1, field, width, height);
            char left   = get(x-1, y, field, width, height);
            char right  = get(x+1, y, field, width, height);

            if(right  != left && left    != ' '  && right  != ' ' ||
               bottom != upper && bottom != ' '  && upper  != ' ' ||
               right  != upper && right  != ' '  && upper  != ' ' ||
               right  != bottom && right != ' '  && bottom != ' ' ||
               left   != upper && left   != ' '  && upper  != ' ' ||
               left   != bottom && left  != ' '  && upper  != ' ')
            {
                if(ret == NULL)
                {
                    size++;
                    ret = malloc(sizeof(point));

                    if(!ret)
                    {
                        printf("\n\n\n Bad memory error! Line %d\n\n\n", __LINE__);
                        exit(1);
                    }

                    ret[size-1] = new_point(x, y);
                }
                else
                {
                    size++;
                    ret = realloc(ret, sizeof(point)*size);

                    if(!ret)
                    {
                        printf("\n\n\n Bad memory error! Line %d, size %d\n\n\n", __LINE__, size);
                        exit(1);
                    }

                    ret[size-1] = new_point(x, y);
                }
            }
        }       

    *sizeret = size;

    return ret;
}

它的作用:它遍历整个 characters 数组field,并在相邻的字符中寻找不同字符的点。这是生成迷宫所必需的。这些点被输入到一个数组ret中,它的长度是size,然后是sizeret。

但是在调用这个函数时,我总是得到一个错误(在 branch 中else)。该算法似乎有效,但在我将其移至单独的函数后问题就开始了。

我究竟做错了什么?

c
  • 2 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-05-25 04:04:19 +0000 UTC

“调试器安装不正确”Visual Studio 17

  • 10

你好。我在 Studio 中创建了一个新的 WPF 项目,保留了必要的小部件,我尝试启动,但出现错误:

Ошибка при попытке запуска проекта: не удалось запустить программу 
<путь>
Отладчик установлен неправильно. Запустите программу Setup для установки или 
восстановления отладчика.

我运行安装程序,选择VS17 -> change。摘要指出(如果重要的话):

  • 包括
    • 桌面开发工具
    • .NET 4.6.1 的开发工具
    • C# 和 Visual Basic
  • 可选的
    • 混合视觉工作室
    • 实体框架 6 的工具
    • 分析工具
    • F# 语言支持
    • .NET Core 1.0 - 1.1 开发工具
  • .NET Core 运行时可能还需要什么,我永远不会知道。

你能建议可能是什么问题吗?


尝试重新安装工作室导致安装失败并出现以下错误(来自日志)

Не удалось восстановить пакет "Microsoft.Net.4.6.FullRedist,version=4.6.81.6".
        URL-адрес поиска: https://aka.ms/VSSetupErrorReports?q=PackageId=Microsoft.Net.4.6.FullRedist;PackageAction=Repair;ReturnCode=5100
        Затронутые рабочие нагрузки
            Основной редактор Visual Studio (Microsoft.VisualStudio.Workload.CoreEditor,version=15.0.26228.0)
        Затронутые компоненты
            Основной редактор Visual Studio (Microsoft.VisualStudio.Component.CoreEditor,version=15.0.26208.0)
        Журнал
            C:\Users\Илья\AppData\Local\Temp\dd_setup_20170524225231_002_Microsoft.Net.4.6.FullRedist.log
        Сведения
            Команда выполнена: "C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Net.4.6.FullRedist,version=4.6.81.6\dotNetFx-x86-x64-AllOS-ENU.exe" /q /norestart /repair /KeepAUPaused /ChainingPackage Visual_Studio_15_Setup /CEIPconsent /log "C:\Users\Илья\AppData\Local\Temp\dd_setup_20170524225231_002_Microsoft.Net.4.6.FullRedist.log"
            Код возврата: 5100
            Сведения о коде возврата: Азия

在@Eikhner 的建议下,我更新了 windows,手动安装了有问题的包,然后重新启动;没有效果。我试图恢复工作室,但失败了。迄今为止从日志中删除的唯一错误:

Не удалось установить перечисленные рабочие нагрузки и компоненты в продукте из-за сбоев в пакете.

Неполные рабочие нагрузки
    Основной редактор Visual Studio (Microsoft.VisualStudio.Workload.CoreEditor,version=15.0.26228.0)

Неполные компоненты
        Основной редактор Visual Studio (Microsoft.VisualStudio.Component.CoreEditor,version=15.0.26208.0)

Вы можете искать решения по сведениям ниже, изменить выбор рабочих нагрузок и компонентов и повторить установку, или же удалить продукт с компьютера.

Ниже перечислены отдельные сбои в пакете, которые сделали перечисленные выше рабочие нагрузки и компоненты неполными. Чтобы найти имеющиеся отчеты об этих проблемах, скопируйте и вставьте URL-адрес из сообщения о сбое пакета в адресную строку веб-браузера. Если о проблеме уже сообщалось, вы сможете найти решения или обходные пути. В противном случае вы можете создать новую запись о проблеме, в которой другие пользователи смогут найти решения или обходные пути.

Не удалось восстановить пакет "Microsoft.Net.4.6.FullRedist,version=4.6.81.6".
        URL-адрес поиска: https://aka.ms/VSSetupErrorReports?q=PackageId=Microsoft.Net.4.6.FullRedist;PackageAction=Repair;ReturnCode=5100
    Затронутые рабочие нагрузки
        Основной редактор Visual Studio (Microsoft.VisualStudio.Workload.CoreEditor,version=15.0.26228.0)
    Затронутые компоненты
        Основной редактор Visual Studio (Microsoft.VisualStudio.Component.CoreEditor,version=15.0.26208.0)
    Журнал
        C:\Users\Илья\AppData\Local\Temp\dd_setup_20170529214845_002_Microsoft.Net.4.6.FullRedist.log
    Сведения
        Команда выполнена: "C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Net.4.6.FullRedist,version=4.6.81.6\dotNetFx-x86-x64-AllOS-ENU.exe" /q /norestart /repair /KeepAUPaused /ChainingPackage Visual_Studio_15_Setup /CEIPconsent /log "C:\Users\Илья\AppData\Local\Temp\dd_setup_20170529214845_002_Microsoft.Net.4.6.FullRedist.log"
        Код возврата: 5100
        Сведения о коде возврата: Азия

@PashaPash,您正在谈论的文件丢失了,但是有相同的名称和扩展名.log.html

OS Version = 6.0.6000, SP = 0.0, Platform 2
OS Description = Vista - x64 Ultimate Edition 
MSI = 5.0.7601.23593
Windows version = amd64_windowsfoundation_31bf3856ad364e35_6.1.7601.17514_none_615fdfe2a739474c.manifest
Windows servicing = 6.1.7601.18766
CommandLine = C:\f5fa5e713993e05ed093ae6f7e40\\Setup.exe /q /norestart /repair /KeepAUPaused /ChainingPackage Visual_Studio_15_Setup /CEIPconsent /log "C:\Users\Илья\AppData\Local\Temp\dd_setup_20170529214845_002_Microsoft.Net.4.6.FullRedist.log" /x86 /x64 /redist
Using Simultaneous Download and Install mechanism
Operation: Repairing
Package Name = Microsoft .NET Framework 4.6.1 Setup
Package Version = 4.6.01055
User Experience Data Collection Policy: AlwaysUploaded
Logging all the global blocks


Installation Blockers:

Не удается выполнить установку в режиме совместимости.

Final Result: Installation failed with error code: (0x000013EC), "A StopBlock was hit or a System Requirement was not met." (Elapsed time: 0 00:00:08).

由于某种原因,该系统被定义为惠斯特。这意味着什么?

visual-studio
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-03-18 04:39:47 +0000 UTC

缺少显式实例属性

  • 0

你好!有一个类具有类似此构造函数的内容:

class GameTree:
  evaled = 0 # количество просчитанных листьев
  nodes = [] # уникальные листья

  def __init__(self, players, points, cp=0, level=0, line=0):
    # cp - current player
    self.state = arr_to_state(players) # arr_to_state превращает последовательность ходов в состояние поля

    for j in GameTree.nodes: # для каждого уникального листа
      if j.state == self.state: # если состояния равны - равны и объекты
        self = deepcopy(j)        
        return

    GameTree.evaled += 1
    self.index = len(GameTree.nodes)
    GameTree.nodes.append(self) # сохраняем ссылку на себя

    #
    # ...
    #

    assert hasattr(self, 'index')

问题是这样的:为 m 个玩家构建一个 n 维井字游戏的完整图。每个对象都GameTree包含该领域的状态和游戏的可能发展。所有唯一(具有相同字段状态的)实例都存储在GameTree.nodes. 同时,按照计划,每个对象都有一个索引,该索引可以是显式设置的,也可以是从已经计算好的索引中获取的。

尝试为二维井字游戏构建图形时:

GameTree(points=[[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]],
         players=[[[0, 0]], []], 
         cp=1}) 

抛出一个错误:

File "C:\Programing\Python\V4.py", line 151, in pprint
  s += ' %'+str(i.index)
AttributeError: 'GameTree' object has no attribute 'index'

请帮我解决。整个代码(在某些地方 - 很脏):

from copy import deepcopy, copy
from time import time
from threading import Thread
from math import factorial

point_class = lambda a: a.count(0)

class slist(list):
  def without(self, x):
    b = self[:]
    b.remove(x)
    return b

def to_ter_arr(i):
  if i<3:
    return [i]

  return to_ter_arr(i // 3) + [i%3]

def arr_to_num(arr):
  arr = list(map(lambda a: a+1, arr))

  ret = 0

  arr.reverse()

  for i in range(len(arr)):
    ret += (3**i)*arr[i]

  return ret

def arr_to_state(arr):
  ret = [0 for i in range(3**len(arr[0][0]))]

  for p in range(len(arr)):
    for i in arr[p]:
      ret[arr_to_num(i)] = p+1

  return ret

def gen(n):
  ret = slist()

  for i in range(pow(3, n)):
    buff = to_ter_arr(i)
    buff = [0 for i in range((n-len(buff)))]+buff
    buff = list(map(lambda a: a-1, buff))
    ret.append(buff)

  return ret

def three(a, b, c):
  if a == [] or b == [] or c== []:
    return False

  for i in range(len(a)):
    s = [a[i], b[i], c[i]]
    if not s in [[1,1,1], [-1,-1,-1], [0,0,0], [1,0,-1], [-1,0,1]]:
      return False

  return True and a!=b and a!=c and b!=c

def won(pl):
  for a in pl:
    for b in pl:
      for c in pl:
        if three(a, b, c):
          return True

  return False

class GameTree:
  evaled = 0 # количество просчитанных листьев
  nodes = [] # уникальные листья

  def __init__(self, players, points, cp=0, level=0, line=0):
    self.state = arr_to_state(players) # arr_to_state превращает последовательность ходов в состояние поля

    for j in GameTree.nodes: # для каждого уникального листа
      if j.state == self.state: # если состояния равны - равны и листья 
        self = deepcopy(j)        
        return

    GameTree.evaled += 1
    self.index = len(GameTree.nodes)
    GameTree.nodes.append(self) # сохраняем ссылку на себя

    players = slist(deepcopy(players)) # slist это list, для которого
    points = slist(deepcopy(points)) # определен метод without

    if cp == len(players): 
      cp = 0

    self.children = []

    for player in players:
      if won(player):
        return

    if points == []:
      return

    me = players[cp]
    enemies = players.without(me)

    if len(me)>=2:
      for point in points:
        me_ = me + [point]

        if won(me_):
          players[cp].append(point)
          self.children.append(GameTree(players, points.without(point), cp+1, level=level+1))

          return

    blocked = False

    for point in points:
      for en in enemies:
        en_ = en + [point]
        if won(en_):
          buff = deepcopy(players) 
          players[cp].append(point)

          self.children.append(GameTree(players, points.without(point), cp+1, level=level+1))

          players = buff
          blocked = True

    if blocked:
      return

    for point in points:
      buff = deepcopy(players)
      players[cp].append(point)
      self.children.append(GameTree(players, points.without(point), cp+1, level=level+1)) 
      players = buff

    assert hasattr(self, 'index')

  def pprint(self, f):
    s = '#{} {}'.format(self.index, self.state)

    for i in self.children:
      s += ' %'+str(i.index)

    f.write(s+'\n')

  @staticmethod
  def print_result(file_name):
    f = open(file_name, 'w')

    print('len =', len(GameTree.nodes))

    for i in GameTree.nodes:
      i.pprint(f)

    f.close()



def progress():
  global aprox, game, start
  while game.is_alive():
    print('\r{} , {} s'.format(GameTree.evaled, int(time()-start)), end='')


n = int(input('N = ') or '2')
points = gen(n)

pc = int(input('Количество игроков: ') or '2')
center = slist([0 for i in range(n)])
players = slist([[center]]+[[] for i in range(pc-1)])

file_name = input('Имя файла: ')  or 'log.txt'
f = open(file_name, 'w')

show = input('Показывать прогресс (Д\Н, Д по умолчанию)') or 'д'

if show == 'H' or show == 'н':
  show = False

elif show == 'Д' or show == 'д':
  show = True

else:
  print('Ошибка!!!')
  exit(1)

print('\nCenter =', center)
print('Players =', players)
print('Points =', points)
start = time()


game = Thread(target = GameTree, kwargs = {'players': players, 'points': points.without(center), 'cp': 1, 'level': 1})
prog = Thread(target = progress)

game.start()

if show:
  prog.start()

game.join()
progress()

GameTree.print_result(file_name)

print(time()-start, 's')
python
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-11-24 01:49:30 +0000 UTC

强制重绘元素

  • 1

你好!有一个任务:随着程序的运行,将中间状态显示在一个表格中。有一些代码:

var table = document.getElementById('table');

function wait(ms)
{
  var time = new Date().getTime();

  while(new Date() - time <= ms){}
}

function run()
{
  for(var i=0; i<10; i++)
  {
    var l = document.createElement('tr');
    var e = document.createElement('td');
    e.innerText = String(i);
    l.appendChild(e);
    table.appendChild(l);
    wait(100);
  }
}
<table id = table>
</table>
<input type="button" value="run" onclick="run()">

在这种情况下,所有信息都会出现,但仅在功能完成后出现。如何让文字在代码中加入的瞬间出现?

javascript
  • 1 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-11-11 03:51:45 +0000 UTC

在画布上重绘 svg

  • 2

你好!有一个任务 - 绘制和下载 svg,这样的结构

<svg id="canv" style="width: 220px; height: 220px;">       
  <g id="grid">
    <line x1="22" y1="0" x2="22" y2="220" stroke="black"></line>
    <line x1="44" y1="0" x2="44" y2="220" stroke="black"></line>
    <line x1="66" y1="0" x2="66" y2="220" stroke="black"></line>
    <line x1="88" y1="0" x2="88" y2="220" stroke="black"></line>
    <line x1="110" y1="0" x2="110" y2="220" stroke="black"></line>
    <line x1="132" y1="0" x2="132" y2="220" stroke="black"></line>
    <line x1="154" y1="0" x2="154" y2="220" stroke="black"></line>
    <line x1="176" y1="0" x2="176" y2="220" stroke="black"></line>
    <line x1="198" y1="0" x2="198" y2="220" stroke="black"></line>
    <line x1="0" y1="22" x2="220" y2="22" stroke="black"></line>
    <line x1="0" y1="44" x2="220" y2="44" stroke="black"></line>
    <line x1="0" y1="66" x2="220" y2="66" stroke="black"></line>
    <line x1="0" y1="88" x2="220" y2="88" stroke="black"></line>
    <line x1="0" y1="110" x2="220" y2="110" stroke="black"></line>
    <line x1="0" y1="132" x2="220" y2="132" stroke="black"></line>
    <line x1="0" y1="154" x2="220" y2="154" stroke="black"></line>
    <line x1="0" y1="176" x2="220" y2="176" stroke="black"></line>
    <line x1="0" y1="198" x2="220" y2="198" stroke="black"></line>
  </g>

  <line x1="165" y1="187" x2="121" y2="33" stroke="black"></line>
  <line x1="121" y1="33" x2="187" y2="55" stroke="black"></line>
  <line x1="187" y1="55" x2="99" y2="165" stroke="black"></line>
  <line x1="99" y1="165" x2="165" y2="187" stroke="black"></line>
</svg>

(组内有几行,组grid外有几行,颜色可以任意)

为此,我编写了以下代码:

function download()
{
  var temp = document.createElement('canvas');

  temp.style.width = canvas.width*cellSize;
  temp.style.height = canvas.height*cellSize;

  var ctx = temp.getContext('2d');

  for(var i=0; i<canv.getElementById('grid').children.length; i++)
  {
    var el = canv.getElementById('grid').children[i];
    console.log(el);

    ctx.strokeStyle = el.getAttribute('stroke');

    var x1 = el.getAttribute('x1'),
        x2 = el.getAttribute('x2'),
        y1 = el.getAttribute('y1'),
        y2 = el.getAttribute('y2');


    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();
  }

  for(var i=1; i<canv.children.length; i++)
  {
    var el = canv.children[i];
    console.log(el);
    ctx.strokeStyle = el.getAttribute('stroke');

    var x1 = el.getAttribute('x1'),
        x2 = el.getAttribute('x2'),
        y1 = el.getAttribute('y1'),
        y2 = el.getAttribute('y2');


    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();
  }

  document.body.appendChild(temp);

  var link = document.createElement('a');
  link.setAttribute('download', '');
  link.setAttribute('href', temp.toDataURL());
  link.click();
}

结果,下载了以下图像:

在此处输入图像描述

链接到 Jsfiddle(你需要点击图片)。

请帮我修一下。

javascript
  • 3 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-08-29 05:36:33 +0000 UTC

如何去除 Canvas 元素上的抗锯齿?

  • 10

有一个像这样的javascript代码:

function updateGrid()
{
  cntx.strokeStyle = 'white';
  cntx.lineCap = 'butt';
  cntx.lineWidth = 1;
  for(var x = 0; x < canvas.width; x++)
  {
      cntx.beginPath();
      cntx.moveTo(x * cellSize + move.x, move.y);
      cntx.lineTo(x * cellSize + move.x, canvas.width * cellSize+move.y);
      cntx.stroke();  
      cntx.closePath()
  }
}

它应该画canvas.width 白线,一个像素粗。但事实证明,在屏幕截图中:

我在某个论坛上读到,删除该行会有所帮助cntx.beginPath();。但如果没有它,就会画出更奇怪的东西:

在另一个论坛上,他们说线宽可能小于一个。在下图中,宽度.0,没有线cntx.beginPath();:

这是她的:

告诉我如何摆脱它?

javascript
  • 2 个回答
  • 10 Views
Martin Hope
Rennorb
Asked: 2020-08-02 05:10:07 +0000 UTC

复制数组的值,而不是对它的引用

  • 7

你好!告诉我,我如何在 JavaScript 中复制一个数组,以便当副本发生变化时,原始数组不会发生变化?例如:

a = [0, 1, 2, 3]
b = clone(a)
b[0] = 10
a[0] == 0 // => true

是否可以实施这种方法clone?

javascript
  • 5 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5