[kuangbin带你飞]专题一 简单搜索 - N - Find a way

正确代码:

 1 #include<iostream>
 2 #include<queue>
 3 #define N 210
 4 #define inf 0xffffff
 5 using namespace std;
 6 int m,n,mark[N][N],dis[N][N][2],dir[4][2]={1,0, 0,1, -1,0, 0,-1},flag;
 7 char s[N][N];
 8 struct node{
 9    int x,y,step;
10 };
11 bool judge(int x,int y)
12 {
13    if(x>=0 && x<m && y>=0 && y<n && s[x][y]!=‘#‘ && mark[x][y]==0)
14        return 1;
15    return 0;
16 }
17 void bfs(int x,int y)
18 {
19    int k;
20    queue<node>q;
21    node cur,next;
22    cur.x=x;cur.y=y;cur.step=0;
23    mark[x][y]=1;
24    q.push(cur);
25    while(!q.empty())
26    {
27        cur=q.front();
28        q.pop();
29        next.step=cur.step+1;
30        for(k=0;k<4;k++)
31        {
32            next.x=x=cur.x+dir[k][0];
33            next.y=y=cur.y+dir[k][1];
34            if(judge(x,y))
35            {
36                mark[x][y]=1;
37                if(s[x][y]==‘@‘)
38                    dis[x][y][flag]=next.step;
39                q.push(next);
40            }
41        }
42    }
43 }
44
45 int main()
46 {
47    int i,j,min;
48    while(scanf("%d %d",&m,&n)!=-1)
49    {
50        min=inf;
51        for(i=0;i<m;i++)
52            for(j=0;j<n;j++)
53                dis[i][j][0]=dis[i][j][1]=inf;
54
55        for(i=0;i<m;i++)
56            scanf("%s",s[i]);
57        for(i=0;i<m;i++)
58            for(j=0;j<n;j++)
59            {
60                if(s[i][j]==‘Y‘)
61                {
62                    flag=0;
63                    memset(mark,0,sizeof(mark));
64                    bfs(i,j);
65                }
66                else if(s[i][j]==‘M‘)
67                {
68                    flag=1;
69                    memset(mark,0,sizeof(mark));
70                    bfs(i,j);
71                }
72            }
73        for(i=0;i<m;i++)
74            for(j=0;j<n;j++)
75                if(s[i][j]==‘@‘ && min>dis[i][j][0]+dis[i][j][1])
76                    min=dis[i][j][0]+dis[i][j][1];
77            printf("%d\n",min*11);
78    }
79    return 0;
80 }

被逼疯代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #define INF 0x3f3f3f3f
  7 using namespace std;
  8 struct node
  9 {
 10     int x;
 11     int y;
 12     int step;
 13 };
 14 char g[205][205];
 15 int stepA[205][205];
 16 int stepB[205][205];
 17     queue<node>q;
 18 int yx, yy, mx, my;
 19 int x, y;
 20 long long ans;
 21 int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
 22
 23 int main()
 24 {
 25 //    freopen("in.in","r",stdin);
 26 //    freopen("out.txt","w",stdout);
 27     while(scanf("%d%d",&x,&y)!=EOF)
 28     {
 29         memset(g,0,sizeof(g));
 30         memset(stepA,-1,sizeof(stepA));
 31         memset(stepB,-1,sizeof(stepB));
 32         char tmp[205];
 33         for(int i = 1; i <= x; i++)
 34         {
 35             scanf("%s",tmp);
 36             for(int j = 1; j <= y; j++)
 37             {
 38                 if(tmp[j-1]==‘Y‘)
 39                 {
 40                     yx = i;
 41                     yy = j;
 42                 }
 43                 if(tmp[j-1]==‘M‘)
 44                 {
 45                     mx = i;
 46                     my = j;
 47                 }
 48                 g[i][j] = tmp[j-1];
 49             }
 50         }
 51         ans = INF;
 52
 53         node s, t;
 54
 55         s.x = yx;
 56         s.y = yy;
 57         s.step = 0;
 58         q.push(s);
 59         while(q.size())
 60         {
 61             s = q.front();
 62             q.pop();
 63             stepA[s.x][s.y] = s.step;
 64             for(int i = 0; i < 4; i++)
 65             {
 66                 t.x = s.x + d[i][0];
 67                 t.y = s.y + d[i][1];
 68                 t.step = s.step + 1;
 69                 if(stepA[t.x][t.y] != -1)    continue;
 70                 if(g[t.x][t.y]==‘.‘|| g[t.x][t.y]==‘@‘)
 71                     q.push(t);
 72             }
 73         }
 74         s.x = mx;
 75         s.y = my;
 76         s.step = 0;
 77         q.push(s);
 78         while(q.size())
 79         {
 80             s = q.front();
 81             q.pop();
 82             stepB[s.x][s.y] = s.step;
 83             for(int i = 0; i < 4; i++)
 84             {
 85                 t.x = s.x + d[i][0];
 86                 t.y = s.y + d[i][1];
 87                 t.step = s.step + 1;
 88                 if(stepB[t.x][t.y] != -1)    continue;
 89                 if(g[t.x][t.y]==‘.‘|| g[t.x][t.y]==‘@‘)
 90                     q.push(t);
 91             }
 92         }
 93         for(int i = 1; i <= x; i++)
 94         {
 95             for(int j = 1; j <= y; j++)
 96             {
 97                 if(g[i][j]==‘@‘ && stepA[i][j]+stepB[i][j]<ans && stepA[i][j]!=-1 && stepB[i][j]!=-1)
 98                     ans = stepA[i][j]+stepB[i][j];
 99             }
100         }
101         cout<<ans*11<<endl;
102     }
103
104     return 0;
105 }
时间: 2024-11-25 23:49:04

[kuangbin带你飞]专题一 简单搜索 - N - Find a way的相关文章

kuangbin带你飞专题一 简单搜索 题解

目录 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题一 简单搜索 总结:用时2天半终于把这个专题刷完了 对于最基础的dfs bfs 路径打印 状态转移也有了一点自己些微的理解 其实2天半可以压缩到1天半的 主要是自己太懒了...慢慢加油刷bin神的专题呀 从大二下学期开始学算法 一开始就知道这个专题 一开始对于这个专题里的所有问题感觉都好难啊..就直接放弃了 看lrj的书 现在看到这个专题还挺唏嘘的吧 突然觉得思维和想法也不是很难 果然是那个时候心不静&还是储量不够吗

[kuangbin带你飞]专题一 简单搜索 - E - Find The Multiple

1 //Memory Time 2 //2236K 32MS 3 4 #include<iostream> 5 using namespace std; 6 7 int mod[524286]; //保存每次mod n的余数 8 //由于198的余数序列是最长的 9 //经过反复二分验证,436905是能存储198余数序列的最少空间 10 //但POJ肯定又越界测试了...524286是AC的最低下限,不然铁定RE 11 12 int main(int i) 13 { 14 int n; 15

[kuangbin带你飞]专题一 简单搜索 棋盘问题

题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C.Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k

[kuangbin带你飞]专题一 简单搜索

一直拖.放了放久.受不了 A - 棋盘问题 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第

[kuangbin带你飞]专题一 简单搜索 A - 棋盘问题

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白

Catch That Cow POJ - 3278 [kuangbin带你飞]专题一 简单搜索

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two m

[kuangbin带你飞]专题一 简单搜索 bfs B - Dungeon Master

B - Dungeon Master You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You c

[kuangbin带你飞]专题一 简单搜索 - M - 非常可乐

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 bool cup[105][105][105]; 8 struct dot 9 { 10 int a; 11 int b; 12 int c; 13 int s; 14 }; 15 int x, y,

[kuangbin带你飞]专题一 简单搜索 - L - Oil Deposits

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 char g[105][105]; 8 int x, y, ans; 9 int dx[3]={1,0,-1}; 10 int dy[3]={1,0,-1}; 11 bool sscanf() 12

Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonal