01距离 解题报告
来源:互联网 发布:fifaol3数据库 编辑:程序博客网 时间:2024/06/06 20:04
【输入样例】
3 4
0001
0011
0110
【输出样例】
3 2 1 0
2 1 0 0
1 0 0 1
【数据范围及提示】
对于30%的数据,n*m<=10000;
对于100%的数据,n*m<=182^2.
【解题思路】
之前的思路不太对啊。。每找到一个0就广搜一遍。。明显超时(⊙o⊙)…
然而反向思维就是正解了。。。
由题目描述可以知道dis[i,j]其实就是点(i,j)到离他最近的那个为1的点的最小步数,这一类问题就是经典的广搜问题;
首先寻找值为1的点,把他们如队列;
然后从队列首开始扫,每次扩展队列中元素周围的四个点,如果是0就入队列,步数是头指针+1;
这样就很容易求出答案;
queue[i][0]为队列中第i个元素的横坐标;
queue[i][1]为队列中第i个元素的纵坐标;
queue[i][2]为队列中第i个元素的dis,也就是最小步数;
【代码】
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int sx[4]={1,-1,0,0};int sy[4]={0,0,1,-1};int queue[40000][3];int n,m,head,tail,i,j,a[2000][2000],dis[2000][2000],x,y;char ss[2000];int main(){freopen("dis.in","r",stdin);freopen("dis.out","w",stdout);scanf("%d%d",&n,&m);head=0;tail=0;for (i=1;i<=n;++i){cin>>ss;for (j=1;j<=m;++j){a[i][j]=ss[j-1]-48;if (a[i][j]==1)//寻找所有的1,入队列{tail++;queue[tail][0]=i;queue[tail][1]=j;queue[tail][2]=0;}}}while (head<tail){head++;for (i=0;i<4;++i)//向头指针的四个方向扩展{x=queue[head][0]+sx[i];y=queue[head][1]+sy[i];if (x>0&&y>0&&x<=n&&y<=m&&a[x][y]==0)//判断是否越界以及是否为0{a[x][y]=1;tail++;//入队列queue[tail][0]=x;queue[tail][1]=y;queue[tail][2]=queue[head][2]+1;//步数+1dis[x][y]=queue[tail][2];//dis的值就等于最小步数}}}for (i=1;i<=n;++i){for (j=1;j<=m;++j) printf("%d ",dis[i][j]);printf("\n");}return 0;}【心得】
有的时候需要逆向思维。。。就差那么一点点。、
0 0
- 01距离 解题报告
- 动态规划求编辑距离——算法解题报告
- hdu_2001_计算两点间的距离_解题报告
- timus 1588. Jamaica URAL 解题报告 平面点距离和
- (解题报告)HDU2001---计算两点间的距离
- Leetcode 72. Edit Distance 编辑距离 解题报告
- Leetcode 477. Total Hamming Distance 总海明距离 解题报告
- Leetcode 461. Hamming Distance 汉明距离 解题报告
- 动态规划求编辑距离——算法解题报告
- 01-package 解题报告
- 01 Matrix解题报告
- 【LeetCode】01 Matrix 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 解题报告
- 社説 20150816 戦没者追悼式 「深い反省」を世界の平和に
- oracle简单复习
- fork与缓存
- 通过trait reference来保存 函数、closure 的调用入口
- QT_QAction
- 01距离 解题报告
- windows下安装redis
- 数据排列,最小排列数
- Python编程习惯
- linux学习之软链接和硬链接
- matlab基础 数据拟合
- 安卓端实现拉出式、抽屉式、仿QQ侧滑菜单效果
- 2015年8月总结
- 【七】C++一些新的关键字 -- new、delete、强制类型转换