C++ 打印房间,但只能访问一次

C++ 打印房间,但只能访问一次,c++,string,extended-ascii,memory-access,C++,String,Extended Ascii,Memory Access,我正在修补打印房间的方法。我使用了中的方框图字符来测试这一点,因此我认识到这限制了我的代码将在其上编译的范围 如果您不想在那里阅读,请快速解释问题: 房间定义为4位整数,以便 最重要的位表示房间是否有西墙 下一个最重要的位是房间是否有北墙 下一个最低有效位是房间是否有东墙 最低有效位表示房间是否有南墙 例如,由0b1101表示的房间将具有西墙、北墙和南墙: ┌─ │ └─ 还有其他限制: 房间的外墙将始终有一面墙 内墙将始终在两个房间中表示(示例0b1101的墙朝南,因此它下面的房间必须设

我正在修补打印房间的方法。我使用了中的方框图字符来测试这一点,因此我认识到这限制了我的代码将在其上编译的范围

如果您不想在那里阅读,请快速解释问题:

房间定义为4位整数,以便

  • 最重要的位表示房间是否有西墙
  • 下一个最重要的位是房间是否有北墙
  • 下一个最低有效位是房间是否有东墙
  • 最低有效位表示房间是否有南墙
例如,由0b1101表示的房间将具有西墙、北墙和南墙:

┌─
│
└─
还有其他限制:

  • 房间的外墙将始终有一面墙
  • 内墙将始终在两个房间中表示(示例0b1101的墙朝南,因此它下面的房间必须设置下一个最重要的位,指示北墙)
  • 房间的数量永远不会超过
    数值限制::max()
  • 我的问题是选择相交字符。我的暴力算法必须访问每个房间两次(除第一行/列中的房间外)。是否有办法找到每个房间只有一次内存访问的交点?


    如果您想查看我的代码以供参考;它包括:

  • 房间信息的
    矢量
  • A
    size\u t
    给出行宽
  • 带有每个房间标签的
    vector
    (可设置为
    vector(size(testValues),-17)
    只打印房间结构而不带标签
  • 字符串打印数组(常量向量和测试值、常量大小和宽度、常量向量和索引){
    if(空(testValues)){
    返回字符串();
    }否则{
    字符串结果;
    auto prevLine=“\xC9\xCD”s;
    前置预留(2U*(1U+宽度));
    用于(自动i=0U;i+1<宽度;++i){
    if((测试值[i]&0b10)!=0){
    prevLine+=“\xD1\xCD”s;
    }否则{
    prevLine+=“\xCD\xCD”s;
    }
    }
    prevLine+=“\xBB\n”s;
    结果.保留(大小(前一行)*(1U+2U*大小(测试值)/宽度);
    对于(自动i=0U;i<大小(测试值)-宽度;++i){
    const auto x=i%宽度;
    const auto isBottomSet=(testValues[i]&0b1)!=0;
    如果(x==0){
    结果+=(prevLine+'\xBA')+static_cast('0'+索引[i]);
    prevLine=isBottomSet?”\xC7\xC4“s:“\xBA”s;
    }
    如果(x+1U==宽度){
    结果+=“\xBA\n”s;
    prevLine+=isBottomSet?\xB6\n“s:”\xBA\n“s;
    }否则{
    const auto isRightSet=(测试值[i]&0b10)!=0;
    const size_t index=static_cast(isRightSet)>2 | static_cast(isBottomSet);
    //MSB:isAboveIntersectionSet
    //isRightOfIntersectionSet
    //isBelowIntersectionSet
    //LSB:isLeftOfIntersectionSet
    constexpr const char*getcrossion[]={“”//0b0
    “”,//0b1
    “”,//0b10
    “\xBF”,//0b11
    “\xC4”,//0b100
    “\xC4\xC4”,//0b101
    “\xDA\xC4”,//0b110
    “\xC2\xC4”,//0b111
    “”,//0b1000:
    “\xD9”,//0b1001
    “\xB3”,//0b1010
    “\xB4”,//0b1011
    “\xC0\xC4”,//0b1100
    “\xC1\xC4”,//0b1101
    “\xC3\xC4”,//0b1110
    “\xC5\xC4”};//0b1111
    结果+={isRightSet?'\xB3':'',静态_cast('0'+索引[i+1]);
    prevLine+=getcrossion[索引];
    }
    }
    结果+=(prevLine+'\xBA')+静态_转换('0'+索引[大小(测试值)-宽度]);
    prevLine=“\xC8\xCD”s;
    对于(自动i=大小(测试值)-宽度;i+1<大小(测试值);+i){
    if((测试值[i]&0b10)!=0){
    结果+={'\xB3',静态_cast('0'+索引[i+1])};
    prevLine+=“\xCF\xCD”s;
    }否则{
    结果+={',静态_cast('0'+索引[i+1])};
    prevLine+=“\xCD\xCD”s;
    }
    }
    返回结果+“\xBA\n”s+prevLine+'\xBC';
    }
    }
    
    如果您对这方面的简单测试感兴趣,您可以:

    const vector<char> rooms = { 0b1101,    0b110,  0b1101, 0b110,  0b1100, 0b101,  0b110,
                                 0b1110,    0b1001, 0b110,  0b1011, 0b1010, 0b1111, 0b1010,
                                 0b1000,    0b101,  0b11,   0b1110, 0b1011, 0b1110, 0b1010,
                                 0b1011,    0b1101, 0b101,  0b1,    0b101,  0b11,   0b1011 };
    const vector<int> indexes = { 1,    1,  2,  2,  3,  3,  3,
                                  1,    1,  1,  2,  3,  5,  3,
                                  1,    1,  1,  6,  3,  6,  3,
                                  1,    6,  6,  6,  6,  6,  3 };
    
    cout << printArray(rooms, width, indexes) << endl;
    
    const vector rooms={0b1101、0b110、0b1101、0b110、0b1100、0b101、0b110、,
    0b1110、0b1001、0b110、0b1011、0b1010、0b1111、0b1010、,
    0b1000、0b101、0b11、0b1110、0b1011、0b1110、0b1010、,
    0b1011、0b1101、0b101、0b1、0b101、0b11、0b1011};
    常量向量索引={1,1,2,2,3,3,3,
    1,    1,  1,  2,  3,  5,  3,
    1,    1,  1,  6,  3,  6,  3,
    1,    6,  6,  6,  6,  6,  3 };
    
    你能解释一下你使用的是哪一组精确的字符吗(特别是在十字路口)?@Davidsherring是的,所以
    const vector<char> rooms = { 0b1101,    0b110,  0b1101, 0b110,  0b1100, 0b101,  0b110,
                                 0b1110,    0b1001, 0b110,  0b1011, 0b1010, 0b1111, 0b1010,
                                 0b1000,    0b101,  0b11,   0b1110, 0b1011, 0b1110, 0b1010,
                                 0b1011,    0b1101, 0b101,  0b1,    0b101,  0b11,   0b1011 };
    const vector<int> indexes = { 1,    1,  2,  2,  3,  3,  3,
                                  1,    1,  1,  2,  3,  5,  3,
                                  1,    1,  1,  6,  3,  6,  3,
                                  1,    6,  6,  6,  6,  6,  3 };
    
    cout << printArray(rooms, width, indexes) << endl;