UVa Problem Solution: 10189 - Minesweeper

本文介绍了一种用于扫雷游戏的简单直接算法实现。通过计算矩阵中每个元素周围八个位置的雷数来标记雷区,适用于任何大小的游戏地图。文章包含完整的C语言代码示例,适合初学者学习。

Straight forward method. I did not work out a funnier solution.

Code:
  1. /*************************************************************************
  2.  * Copyright (C) 2008 by liukaipeng                                      *
  3.  * liukaipeng at gmail dot com                                           *
  4.  *************************************************************************/
  5. /* @JUDGE_ID 00000 10189 C "Minesweeper" */
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <strings.h>
  13.                
  14. #define MAX 102
  15. int around(int mat[][MAX], int n, int m)
  16. {
  17.   return mat[n-1][m-1] + mat[n-1][m] + mat[n-1][m+1]
  18.     + mat[n][m-1] + mat[n][m+1]
  19.     + mat[n+1][m-1] + mat[n+1][m] + mat[n+1][m+1];
  20. }
  21. int main(int argc, char *argv[])
  22. {
  23. #ifndef ONLINE_JUDGE
  24.   char in[256];
  25.   char out[256];
  26.   strcpy(in, argv[0]);
  27.   strcat(in, ".in");
  28.   strcpy(out, argv[0]);
  29.   strcat(out, ".out");
  30.   close(0); 
  31.   open(in, O_RDONLY);
  32.   close(1);
  33.   open(out, O_WRONLY | O_CREAT, 0600);
  34. #endif
  35.   
  36.   int mat[MAX][MAX];
  37.   int n, m, i, j, f = 1;
  38.   char c;
  39.   for (scanf("%d %d", &n, &m); n != 0 && m != 0; scanf("%d %d", &n, &m)) {
  40.     if (f != 1)
  41.       putchar('/n');
  42.     bzero(mat, MAX*MAX*sizeof(int));
  43.     c = getchar();
  44.     for (i = 1; i <= n; ++i) {
  45.       for (j = 1; j <= m; ++j) {
  46.         c = getchar();
  47.         if (c == '*') mat[i][j] = 1;
  48.         else if (c == '.') mat[i][j] = 0;
  49.       }
  50.       c = getchar();
  51.     }
  52.     printf("Field #%d:/n", f++);
  53.     for (i = 1; i <= n; ++i) {
  54.       for (j= 1; j <= m; ++j) {
  55.         if (mat[i][j] == 1) putchar('*');
  56.         else printf("%d", around(mat, i, j));
  57.       }
  58.       putchar('/n');
  59.     }
  60.   }
  61.   
  62.   return 0;
  63. }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值