MYF

Codeforces 253C Text Editor

题目链接

codeforces 253C

解题方法:BFS(广度优先搜索)

题目分析

题目大意

给定n行,然后给n个数,代表每一行的字符数量,再给定两个坐标st、ed,表示起点光标所在位置以及终点光标所在位置,求最少按几下键盘(限上下左右),光标从起点到终点

解析

有点像最短路径的感觉,实际上是一个BFS广度优先搜索的问题。BFS的过程是层层扩散的,到达某一个点总是以最短的步数,然后在vis[][]中标记,表示该点已访问(因为再访问这个点的话一定走的步数比之前走到这的步数多,所以无需更新)。又因为这一行行的字符一定是连通的(起码第一个字符总得连通吧),所以,一定是可以搜索到终点的。先把起点push进队列q,然后取队首元素,对该点进行上下左右的判断,依次入队。然后重复此操作,直至找到终点,输出步数,结束。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define For(i, n) for (int i = 1; i <= n; i++)
#define ForK(i, k, n) for (int i = k; i <= n; i++)
#define ForD(i, n) for (int i = n; i >= 0; i--)
#define Rep(i, n) for (int i = 0; i < n; i++)
#define RepD(i, n) for (int i = n; i >= 0; i--)
#define MemI(a) memset(a, 0, sizeof(a))
#define MemC(a) memset(a, '\0', sizeof(a))
#define vset(a,val) memset(a,val,sizeof(a))
#define pf printf
#define sf(n) scanf("%d", &n)
#define sff(a,b) scanf("%d %d", &a, &b)
#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
#define PI acos(-1)
#define bug pf("Hi----------\n")
#define eps 1e-8
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long ll;
using namespace std;
#define maxn 100005
int vis[105][maxn];
int a[105]={},n;
struct point{
int x,y,moves;
}st,ed;
void BFS(){
memset(vis, 0, sizeof(vis));
queue<point>q;
q.push(st);
while (!q.empty()) {
point tmp=q.front();
point newp;
q.pop();
if (tmp.x==ed.x&&tmp.y==ed.y) {
cout<<tmp.moves<<endl;
return;
}
newp.moves=tmp.moves+1;
for (int i=0; i<4; i++) {
if (i==0) {//上
newp.x=max(1,tmp.x-1);
newp.y=min(tmp.y, a[newp.x]);
if (!vis[newp.x][newp.y]) {
vis[newp.x][newp.y]=1;
q.push(newp);
}
}
else if (i==1){//下
newp.x=min(tmp.x+1,n);
newp.y=min(tmp.y, a[newp.x]);
if (!vis[newp.x][newp.y]) {
vis[newp.x][newp.y]=1;
q.push(newp);
}
}
else if (i==2){//左
newp.x=tmp.x;
newp.y=max(1, tmp.y-1);
if (!vis[newp.x][newp.y]) {
vis[newp.x][newp.y]=1;
q.push(newp);
}
}
else{//右
newp.x=tmp.x;
newp.y=min(a[newp.x], tmp.y+1);
if (!vis[newp.x][newp.y]) {
vis[newp.x][newp.y]=1;
q.push(newp);
}
}
}

}
}
int main(){
freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
scanf("%d",&n);
for (int i=1; i<=n; i++){
scanf("%d",&a[i]);
a[i]++;
}
scanf("%d %d",&st.x,&st.y);
scanf("%d %d",&ed.x,&ed.y);
BFS();
}