【swu】扫雷问题

xiaoziHZP 2014-05-11 11:33:57

这是代码:
#include<stdio.h>
char a[2002][2002];
int main(void)
{
int i, k, m, n;
scanf("%d %d", &n, &m);
//读取地雷分布图
for(i = 1; i<=n; i++)
for(k = 1; k<=m; k++)
{
scanf("%c", &a[i][k]);
if(a[i][k] == '\n')
scanf("%c", &a[i][k]);
}
//所有非雷区化为0
for(i = 1; i<=n; i++)
for(k = 1; k<=m; k++)
{
if(a[i][k] !='*')
a[i][k] = '0';
}
//扫描雷区
for(i = 1; i<=n; i++){
for(k = 1; k<=m; k++)
{
if(a[i][k] !='*')
{
a[i][k]+=(a[i-1][k-1] == '*')
+(a[i-1][k] == '*')
+(a[i-1][k+1] =='*')
+(a[i][k-1] == '*')
+(a[i][k+1] =='*')
+(a[i+1][k-1] == '*')
+(a[i+1][k] == '*')
+(a[i+1][k+1] == '*');
}
printf("%c",a[i][k]);
}
printf("\n");
}
return 0;
}
程序运行时间有点长,各位大神有没有更简单的算法哦?
...全文
170 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoziHZP 2014-05-13
  • 打赏
  • 举报
回复
引用 5 楼 arthuryangsh 的回复:
你指的超时是怎样计时的?scanf手动输入那个时间消耗可不是一点半点。
测试的数据是由服务器给出的,不需要手动输入。
纹枰老妖 2014-05-13
  • 打赏
  • 举报
回复
楼主的代码据我目测,貌似有数组越界【准确说是逼近界限】带来的bug
纹枰老妖 2014-05-13
  • 打赏
  • 举报
回复
我复制了一下楼主的代码,是秒输出答案,楼主为何还说运行时间长呢?
wyssurvivor 2014-05-11
  • 打赏
  • 举报
回复
我倒没什么好的解法 只是觉得你扫描每一个位置周围的8个位置不好,为什么不直接扫描有雷的位置,然后给这个位置的周围8个数加1,毕竟雷的数量相对于格子的数量少很多
碚雅 2014-05-11
  • 打赏
  • 举报
回复
你指的超时是怎样计时的?scanf手动输入那个时间消耗可不是一点半点。
xiaoziHZP 2014-05-11
  • 打赏
  • 举报
回复
引用 1 楼 wyssurvivor 的回复:
我倒没什么好的解法 只是觉得你扫描每一个位置周围的8个位置不好,为什么不直接扫描有雷的位置,然后给这个位置的周围8个数加1,毕竟雷的数量相对于格子的数量少很多
就是说检测到有雷的位置,之后在扫描周边的八个位置是吗?如果是数字就加一是吗?可是这样还是显示超时了。
碚雅 2014-05-11
  • 打赏
  • 举报
回复
不过手动输入雷图着实雷人,怎么不考虑用文件读入呢?从终端scanf是非常原始的手段。
碚雅 2014-05-11
  • 打赏
  • 举报
回复
楼上的意见很正确。

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧