题解 P6315 【[COCI2006-2007#3] NPUZZLE】

· · 题解

怎么连一篇STL 题解都没有啊!!!

前置芝士:

1$. $map

其实 map 没不用理解成映射这么高大上的词语,我们可以这样理解:

定义 map<string,bool>f 就表示建立一个下标为 string 类型的 f 数组,里面存的都是 bool 值。

:要加头文件 include<map>

2$. $pair

举个栗子:

pair<int,char>a

就相当于

struct Node{
    int first;
    char second;
}a;

显然,a.firstint 类型(不管是struct还是pair);同理,a.secondchar 类型(也不管是struct还是pair)。

再举个栗子:

再假设变量 iint 类型,jchar类型,则

a=Node{i,j};

就相当于

a=make_pair(i,j);
啥都不说,给公式: 设 $A$ 点的坐标为 $(x_1,y_1)$ ,$B$ 点的坐标为 $(x_2,y_2)

AB 的曼哈顿距离为:

------------- 然后就没什么好说的了,上代码: ```cpp #include<iostream> #include<cstdio> #include<map> #include<cmath> #include<cstring> #include<algorithm> using namespace std; char a[5][5]; map< char,pair<int,int> >pos; //dis会返回x行y列到字符ch的标准位置的曼哈顿距离 inline int dis(char ch,int x,int y){ return abs(pos[ch].first-x)+abs(pos[ch].second-y); //套曼哈顿距离的公式 } int main(){ //打表部分开始 pos['A']=make_pair(1,1); pos['B']=make_pair(1,2); pos['C']=make_pair(1,3); pos['D']=make_pair(1,4); pos['E']=make_pair(2,1); pos['F']=make_pair(2,2); pos['G']=make_pair(2,3); pos['H']=make_pair(2,4); pos['I']=make_pair(3,1); pos['J']=make_pair(3,2); pos['K']=make_pair(3,3); pos['L']=make_pair(3,4); pos['M']=make_pair(4,1); pos['N']=make_pair(4,2); pos['O']=make_pair(4,3); //打表部分结束 int ans=0; for(int i=1;i<=4;i++){ scanf("%s",a[i]+1); for(int j=1;j<=4;j++) if(a[i][j]!='.')ans+=dis(a[i][j],i,j); //注意a[i][j]不能为'.' } cout<<ans<<endl; return 0; } ```