YYaung 2022-09-20 15:26
浏览 50
已结题

对于曼哈顿距离求和问题

问题遇到的现象和发生背景

描述:
天天有一个大小为n×m的表格,行数从1到n,列数从1到m,每个单元格都有一个颜色,可以用1到105的整数来表示。

我们把位于第i行第j列的格子表示为(i,j),并将2个格子的距离定义为dis=abs(i2−i1)+abs(j2−j1),即曼哈顿距离

例如,在3×4表中,(1,2)和(3,3)之间的曼哈顿距离为3,其表示如下。(1,2)(2,2)(2,3)(3,3)。

天天决定计算每一对相同颜色(用数字表示颜色,相同数字即相同颜色)的单元格之间的曼哈顿距离之和。请你帮助他计算这个总和。

输入:
第一行包含两个整数n和m(1≤n≤m,n⋅m≤100000)表示行数和列数。

接下来的n行描述表格中的一行。第 i 行包含m 个整数Ci1,Ci2,...,Cim(1≤Cij≤100)表示第 i 行中单元格的颜色。

输出:
一个整数,表示每对相同颜色的单元格之间的曼哈顿距离之和。

注释:
输入
2 3
1 2 3
3 2 1
输出
7
输入

3 4
1 1 2 2
2 1 1 2
2 2 1 1
输出

76
备注

在第一个样本中,有三对相同颜色的单元格:单元格(1,1)和(2,3),单元格(1,2)和(2,2),单元格(1,3)和(2,1)。它们之间的曼哈顿距离分别是3、1和3,所以总和是7。

用代码块功能插入代码,请勿粘贴截图
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#include<vector>
using namespace std;

typedef struct pos
{
    int r;
    int c;
    struct pos *next=nullptr;
}pos;

unordered_map<int,pos*> g;

pos* notinlist(int rr,int cc)//如果不在字典中
{
    pos *p=(pos*)malloc(sizeof(pos));
    p->r=rr;
    p->c=cc;
    p->next=nullptr;
    return p;
}
void* inlist(pos *p,int rr,int cc)//如果在字典中
{

    while(p->next!=nullptr)
        {
            p=p->next;
        }
        pos *temp=(pos *)malloc(sizeof(pos));
        temp->r=rr;
        temp->c=cc;
        temp->next=nullptr;
        p->next=temp;

}
void addpos(int color,int rr,int cc)//加入字典操作
{
    if(g.find(color)==g.end())//如果不存在字典中
    {
        pos *p=notinlist(rr,cc);
        g.emplace(color,*p);
    }
    else
    {
        pos *p=g.at(color);
        inlist(p,rr,cc);

    }
}

int main()
{

    int n,m;
    int color;
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>color;
            addpos(color,i,j);
        }
    }
    int ans=0;
    for(auto iter=g.begin();iter!=g.end();++iter)
    {
        while(iter->second->next!=nullptr)
        {
            pos*stk=iter->second;
            pos*stk2=stk->next;
            while(stk->next!=nullptr||stk2==nullptr)
            {
                ans+=abs(stk->r-stk2->r)+abs(stk->c-stk2->c);
                stk2=stk2->next;
            }
        }
    }
    cout<<ans<<endl;


    system("pause");
    return 0;
}


运行结果及报错内容

error: no matching function for call to 'std::pair<const int, pos*>::pair(int&, pos&)'|

我的解答思路和尝试过的方法

将每个出现的数字加入unordered_map作为键,然后值为一个指针,该指针指向一个链表储存了该建所有出现过的坐标

我想要达到的结果

得出答案

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月28日
    • 创建了问题 9月20日

    悬赏问题

    • ¥200 csgo2的viewmatrix值是否还有别的获取方式
    • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
    • ¥15 请把下列每一行代码完整地读懂并注释出来
    • ¥15 pycharm运行main文件,显示没有conda环境
    • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
    • ¥15 为什么eclipse不能再下载了?
    • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
    • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
    • ¥15 特定网页无法访问,已排除网页问题
    • ¥50 如何将脑的图像投影到颅骨上