UESTC 653 扫雷 模拟
来源:互联网 发布:砍伐树木的数据 编辑:程序博客网 时间:2024/06/01 15:36
扫雷
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
扫雷是一种常见的游戏。现在我们想改变一下扫雷的规则。
在*
代表地雷,用.
代表无雷,请在所有无雷的
位置填上对应的数字,表示能够影响到该位置的雷的数量。
在平面上,坐标
Input
第一行是一个整数
每组数据第一行包含两个数字
接下来包含
*
代表地雷,.
代表无雷,字符中间不含空格。
Output
对于每组数据,输出相应的分布图,有雷的位置输出
的空格)。
Sample input and output
22 1*...3 2*.....*..
-1 11 0-1 1 12 2 0-1 1 1
My Solution
建ch[maxn][maxn]放字符分布图,ci[maxn][maxn]放数字分布图;
然后就是遇到一个*就来一次对角线正交的字符型,就是菱形的感觉。然后开始扫,把4个方向可以简化为1个方向,且对起始点要特别注意,
且很可能是被切过几刀的图像,所以要随时检查边界;
终止点就用|i-x|+|j-y|<=k又因为把四个象限简化到第一象限了,所以用i-x+j-y<=k就好了,
然后,模拟吧。(应该有其它方法的☺☺)
然后,模拟吧。(应该有其它方法的☺☺)
#include <iostream>#include <cstdio>#include <cstring>//#define LOCALusing namespace std;const int maxn=22;char ch[maxn][maxn];int ci[maxn][maxn],k,n;//本来想把左右扫并一起,上下扫并一起 但整个的菱形不一定全在,就不对称了,分开扫又太慢了,对if里面加个条件inline void solve(int x,int y){ for(int i=x;i<=x+k;i++){ if(i==x){ for(int j=y+1;(i-x+j-y<=k);j++){ if((ch[j][i]!='*')&&(j<n&&j>=0&&i>=0&&i<n)) ci[j][i]++; if((ch[2*y-j][i]!='*')&&(2*y-j<n&&2*y-j>=0&&i>=0&&i<n)) ci[2*y-j][i]++; } } else{ if((ch[y][i]!='*')&&i>=0&&i<n)ci[y][i]++;if((ch[y][2*x-i]!='*')&&2*x-i>=0&&2*x-i<n)ci[y][2*x-i]++; for(int j=y+1;(i-x+j-y<=k);j++){ if((ch[j][i]!='*')&&(j<n&&j>=0&&i>=0&&i<n)) ci[j][i]++; if((ch[2*y-j][i]!='*')&&(2*y-j<n&&2*y-j>=0&&i>=0&&i<n)) ci[2*y-j][i]++; if((ch[j][2*x-i]!='*')&&(2*x-i<n&&2*x-i>=0&&j<n&&j>=0)) ci[j][2*x-i]++; //if((ch[j][2*x-i]!='*')&&(2*x-i<n&&2*x-i>=0&&j<n&&j>=0)) ci[j][2*x-1]++;这个地方i写成1了,太不小心了 if((ch[2*y-j][2*x-i]!='*')&&(2*y-j<n&&2*y-j>=0&&2*x-i<n&&2*x-i>=0)) ci[2*y-j][2*x-i]++; } } }}int main(){ #ifdef LOCAL freopen("a.txt","r",stdin); #endif // LOCAL int T; scanf("%d",&T); while(T--){ memset(ci,0,sizeof(ci)); scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%s",ch[i]); for(int j=0;j<n;j++) for(int i=0;i<n;i++) if(ch[i][j]=='*'){ ci[i][j]=-1; solve(j,i);/* 前面总是WA,所以自己造了组数据,还好一组数据就找出问题了 1 6 4 *..... ...... ...... ...**. ....*. *..... 当时出了个'6',明明只有五个雷。所以把每次solve()完都把矩阵输出看看, 反正下面有写,贴上来就好了 for(int i=0;i<n;i++){ printf("%d",ci[i][0]); for(int j=1;j<n;j++) printf(" %d",ci[i][j]); printf("\n"); }printf("\n");*/ } for(int i=0;i<n;i++){ printf("%d",ci[i][0]); for(int j=1;j<n;j++) printf(" %d",ci[i][j]); if(i!=n-1)printf("\n"); } if(T) printf("\n"); } return 0;}
谢谢
0 0
- UESTC 653 扫雷 模拟
- 【模拟】扫雷
- 【模拟】DotNotation UESTC 1001
- UESTC 1262: Memory【模拟】
- UESTC--1251(模拟)
- UESTC 1012:Ladygod【模拟】
- 模拟实现扫雷游戏
- 扫雷游戏模拟
- poj 2612 扫雷 模拟
- UESTC - 1012 Ladygod (模拟)
- c语言模拟扫雷小游戏
- 【GDOI 2013模拟】扫雷游戏
- GDOI2016模拟8.14扫雷游戏
- bzoj1088.扫雷Mine (模拟 || DP)
- UESTC 1651 Fill Numbers(模拟)
- UESTC OJ 1647Battery Charging 模拟题
- UESTC 1823 In Galgame We Trust 模拟
- UESTC OJ 1647Battery Charging 模拟题
- DSOJ Placing apples(放苹果)
- img底部多出3像素解决办法
- IOS开发之文本复制
- Android 之一张图片搞定数据加载进度条+各种颜色效果,任性的不得了
- Android开发必知的50个诀窍之一
- UESTC 653 扫雷 模拟
- Hadoop HDFS DN 内核Bug
- DSOJ 中缀表达式求值
- MFC简易计算器
- 第二天
- 期末小结
- C#类型转换中关于“四舍六入,五看奇偶”
- 第三天
- python 根据标题获取窗口句柄,根据句柄取得进程号,关闭进程