Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速打字编码挑战_C++_Algorithm - Fatal编程技术网

C++ 快速打字编码挑战

C++ 快速打字编码挑战,c++,algorithm,C++,Algorithm,这个问题要求用一个手指在键盘上键入字符串所需的总时间,该字符串表示为二维字符矩阵 输入: 2 31 YLrJpXOygVUl6MqBIRFWuAKsH7Gw4Z8 kE0tTQdP1CcxSjamizon9e5NfvDbh32 YE0 3 第一行包含n和m作为输入,表示键盘矩阵的尺寸 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 2 31 YLrJpXOygVUl6MqBIRFWuAKsH7Gw4Z8 kE0tTQdP1CcxSjamizon9e5

这个问题要求用一个手指在键盘上键入字符串所需的总时间,该字符串表示为二维字符矩阵

输入:

2 31 
YLrJpXOygVUl6MqBIRFWuAKsH7Gw4Z8
kE0tTQdP1CcxSjamizon9e5NfvDbh32
YE0
3
  • 第一行包含n和m作为输入,表示键盘矩阵的尺寸
  • 接下来的n行包含m个字符,每个字符表示键盘中的字符
  • 下一行将包含字符串S
输出:

2 31 
YLrJpXOygVUl6MqBIRFWuAKsH7Gw4Z8
kE0tTQdP1CcxSjamizon9e5NfvDbh32
YE0
3
说明: 手指最初位于键盘的第一个符号处,因此按下该键所需的时间为0。之后,新密钥位于1,1,因此所用的总时间为| 1-0 |+| 1-0 |,即2。现在第三个键位于位置1,2,因此移动到该键的总时间将为| 2-1 |+| 1-1 |=1。所以我们的答案是3

要求打印的字符串位于最后一个输入行,
YE0
,由上述二维矩阵中的字母组成

时间计算逻辑为:
如果您在键盘的单元格(x1,y1)处,现在要按(x2,y2)处的键,则所用时间为| x1-x2 |+| y1-y2 |。您需要计算键入完整字符串所需的总时间。
如果无法键入字符串,则必须打印-1

#include<bits/stdc++.h>

using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    unordered_map<char, pair<int, int>> map1;
    for(int i=0;i<n;i++){
        string s;
        cin>>s;
        for(int j=0;j<m;j++) {
            map1.insert({s[j], make_pair(i,j)});
        }
    }
    string key;
    cin>>key;
    long long total=0;
    pair<int,int> sp;
    for(int i=0;i<key.length();i++) {
        if(map1.find(key[i])==map1.end()) {
            total=-1;
            break;
        } else {
            auto it = map1.find(key[i]);
            if(i==0) sp=it->second;
            pair<int,int> p = it->second;
            total+=(abs(p.first-sp.first) + abs(p.second-sp.second));
            sp=p;
        }
    }
    cout<<total;
}
#包括
使用名称空间std;
int main(){
int n,m;
cin>>n>>m;
无序地图1;
对于(int i=0;i>s;
对于(int j=0;j>键;
长总计=0;
对sp;
对于(int i=0;等秒;
对p=it->second;
总+=(绝对值(p.first-sp.first)+绝对值(p.second-sp.second));
sp=p;
}
}

cout这里是一个免费的失败测试用例

2 31 
YLrJpXOygVUl6MqBIRFWuAKsH7Gw4Z8
kE0tTQdP1CcxSjamizon9e5NfvDbh32
YE 0

应为-1,因为空白不在键矩阵中。
它失败了,因为在第一个空格之前,您只能读入“单词”

这里还有一个:

2 31 
YLrJpXOygVUl6MqBIRFW AKsH7Gw4Z8
kE0tTQdP1CcxSjamizon9e5NfvDbh32
Y E0
不应该是-1,但应该是。同样的问题,但矩阵


因此,您需要做的是将输入读数更改为包含空格。

问题中提到,“手指最初位于键盘的第一个符号处”,因此在解析键时
在代码中,如果(i==0)sp=it->second;
应该从
{0,0}开始考虑从键盘的第一个符号到键的第一个符号的移动。

这是来自于一些竞赛/挑战/竞争性的编码/黑客站点。是吗?如果你的目标是学习C++,你就不会在那里学到任何东西。在几乎所有的情况下,像这个一样,正确的解决方案是基于数学或专业的。除此之外,这里没有什么能真正提高你对C++的知识。如果你想学习C++,你就不能从毫无意义的网络竞赛网站中学习任何东西。是的,这是来自编码挑战。只是想知道我是否缺少一些问题洞察力。这个解决方案对于少数测试用例不起作用。e它给出了错误的输出。我无法找出这些情况。不过谢谢你的提示。请解释你的代码。写注释,重命名变量,描述语义。解释方法。如果你一直这样做,你可能已经发现了你的问题。否则它将帮助其他人找到你的问题。请理解t“这是我的代码,为什么不起作用?”在这里通常被认为不是问题。您需要做一些解释。能够做到这一点通常被认为是从挑战和其他方面学习代码之间的区别。在阅读keymatrix和整数后,您是否再次输出它以验证它是否如预期的那样?您是否将部分距离输出到ver如果它们看起来像预期的一样?你使用了什么测试?只有挑战中的示例?如果没有,你自己想出了哪些测试用例?如果你知道失败的示例,请用这些示例手工解决问题,看看它们如何/为什么与你的预期不匹配。