【BFS】bzoj2252 [2010Beijing wc]矩阵距离

要注意一开始将所有为‘1‘的点入队,然后通过一次BFS去更新所有点的距离,直到无法更新为止。

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 const int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
 6 struct Point{int x,y;Point(const int &a,const int &b){x=a;y=b;}Point(){}};
 7 queue<Point>q;
 8 int n,m,d[1000][1000],num;
 9 char s[1000][1000],CH[20];
10 inline void putint(int x)
11 {
12     num=0;
13     while(x>0){CH[++num]=x%10;x/=10;}
14     while(num)putchar(CH[num--]+48);
15     putchar(‘ ‘);
16 }
17 int main()
18 {
19     scanf("%d%d",&n,&m);
20     memset(d,0x7f,sizeof(d));
21     for(int i=0;i<n;i++)
22       {
23           scanf("%s",s[i]);
24           for(int j=0;j<m;j++)
25             if(s[i][j]==‘1‘)
26               {
27                 d[i][j]=0;
28                 q.push(Point(i,j));
29               }
30       }
31     while(!q.empty())
32       {
33           for(int i=0;i<4;i++)
34             {
35                 int tx=dx[i]+q.front().x,ty=dy[i]+q.front().y;
36                 if(tx>=0&&tx<n&&ty>=0&&ty<m&&d[q.front().x][q.front().y]+1<d[tx][ty])
37                   {
38                       q.push(Point(tx,ty));
39                       d[tx][ty]=d[q.front().x][q.front().y]+1;
40                   }
41             }
42           q.pop();
43       }
44     for(int i=0;i<n;i++)
45       {
46           for(int j=0;j<m;j++)
47             if(d[i][j])putint(d[i][j]);
48             else {putchar(‘0‘);putchar(‘ ‘);}
49           putchar(‘\n‘);
50       }
51     return 0;
52 }
时间: 2024-10-24 12:57:59

【BFS】bzoj2252 [2010Beijing wc]矩阵距离的相关文章

BZOJ2252 [2010Beijing wc]矩阵距离

2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 624  Solved: 304[Submit][Status][Discuss] Description 假设我们有矩阵,其元素值非零即1 a11…… a1m ……………. an1…….anm ?定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L) ?? Input 输入文件的第一行为两个整数,分别代表n和m.

bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2252 又没能自己想出来... 一直在想如何从每个1开始广搜更新答案,再剪剪枝,什么遇到1就不走了... 然而实际上直接多源bfs,从所有1一起开始,因为只需要找到0碰到的第一个1即可: 这样搜一遍就可以,复杂度很美. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<al

bzoj 2251: [2010Beijing Wc]外星联络 后缀数组

2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高 低电平将接收到

BZOJ 2251: [2010Beijing Wc]外星联络

2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号

【CH2501】 矩阵距离 解题报告

CH2501 矩阵距离 描述 给定一个N行M列的01矩阵 A,\(A[i][j]\) 与 \(A[k][l]\) 之间的曼哈顿距离定义为: \(dist(A[i][j],A[k][l])=|i-k|+|j-l|\) 输出一个N行M列的整数矩阵B,其中: \(B[i][j]=min(1 \le x \le N,1 \le y \le M,A[x][y]=1)?{dist(A[i][j],A[x][y])}\) 即求与每个位置曼哈顿距离最近的1 \(N,M \le 1000\). 输入格式 第一行两

AcWing 173. 矩阵距离

题目传送门 今天考试的t1 某位菜鸡考的时候只做了20分 题意:对于给定的01矩阵,求出矩阵上所有点到其最近的1的曼哈顿距离. 思路: 考试的时候看完题,嗯?广搜水题?然后几分钟就打完了那段20分的拙劣代码.最初始的想法:对于每个0点,跑一边bfs即可,时间复杂度O(\(n^2\)),打完觉得不太对,可能会挂,然后改成了对于每个1点,用bfs去遍历更新其他点的最小值,然而时间复杂度似乎没差,自己测的数据还是会T,但抱着侥幸的心理想着应该不会挂太多的点吧--然后就20分了. [正确的解法]合理利用

HDU1067 Gap( BFS+ HASH 剪枝,矩阵用一个数表示)

题意:在4*8 的图中,给你4种类型的牌,每种牌序号1-7,比如42表示第4种牌的第二张,现在给你4*7一共28张,同时最左边的一列开始空的,第一步你要做的是把每种类型的1号牌从上到下放在这列空的位置上,然后在新出现的空位置,你要挑选空位子左边的那张牌的后继,如果没有的话,就不能操作. 解法:题目的状态很多,还有要怎么表示一个状态已经搜索过了呢.那就把矩阵做一下转化,把当前矩阵按行展开,以2为基数化为十进制的数(最大2^32,所以用Long Long),接下来存储这些整数,用map,set应该也

POJ 3026 Borg Maze(Prim+bfs求各点间距离)

题目链接:http://poj.org/problem?id=3026 题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’  ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度. 解题思路:相当于所有的字母A和S都是结点,求连接这些结点的最小距离和,是最小生成树的题目.先用BFS求各点间的距离,然后再用Prim(Kruskal也可以)求出最小距离就可以了. 注意:输完行列m和n之后,后面有一堆空格,要用gets()去掉,题目

矩阵距离

题目 题目描述 假设我们有矩阵,其元素值非零即1 a11........a1m......................................an1........anm 定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-l) 输入 输入文件的第一行为两个整数,分别代表n和m. 接下来的n行,第i行的第 j个字符代表aij 输出 输出包含N行,每行M个用空格分开的数字,其中第i行第j个数字代表Min(D(aij,axy)) 其中1<=x<=N 1&l