题解 P6315 【[COCI2006-2007#3] NPUZZLE】
y0y68
·
·
题解
怎么连一篇纯 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.first 是 int 类型(不管是struct还是pair);同理,a.second 是 char 类型(也不管是struct还是pair)。
再举个栗子:
再假设变量 i 是 int 类型,j 是 char类型,则
a=Node{i,j};
就相当于
a=make_pair(i,j);
啥都不说,给公式:
设 $A$ 点的坐标为 $(x_1,y_1)$ ,$B$ 点的坐标为 $(x_2,y_2)
则 A 到 B 的曼哈顿距离为:
-------------
然后就没什么好说的了,上代码:
```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;
}
```