UESTC 653 扫雷 模拟

ProLightsfx 2016-12-11 121 12/11

扫雷 模拟

Source

UESTC 653 (CDOJ 653)

My Solution

建ch[maxn][maxn]放字符分布图,ci[maxn][maxn]放数字分布图;
然后就是遇到一个*就来一次对角线正交的字符型,就是菱形的感觉。然后开始扫,把4个方向可以简化为1个方向,且对起始点要特别注意,
且很可能是被切过几刀的图像,所以要随时检查边界;
终止点就用|i-x|+|j-y|<=k又因为把四个象限简化到第一象限了,所以用i-x+j-y<=k就好了,

然后,模拟吧。(应该有其它方法的☺☺)

#include 
#include 
#include 
//#define LOCAL
using 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;
}

 

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

https://www.prolightsfxjh.com/

Thank you!

                                                                                                                                             ------from ProLightsfx

- THE END -
Tag:

ProLightsfx

11月15日20:12

最后修改:2024年11月15日
0

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论