6.12-扫雷-复杂模拟

原题:清华大学2017机试样题

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
char map[1000][1000];
bool flag[1000][1000]={false};
bool check[1000][1000]={false};//1表示已经被探明 
int num[1000][1000];
bool newcheck[1000][1000]={false};
int newchecknum;
int checknumsum=0;
int safe=1;
int n,m;
int a[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int allxing=0;
void getnum()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int tem=0;
            for(int k=0;k<8;k++)
            {
                if(map[i+a[k][0]][j+a[k][1]]=='*')
                {
                    tem++;
                }
            }
            num[i][j]=tem;
            if(map[i][j]=='.')
            {
                allxing++;
            }
        }
    }
}

void flaging(int x,int y)
{
    if(check[x][y]==true)
    {
        printf("swept\n");
    }
    else if(check[x][y]==false &&flag[x][y]==false)
    {
        flag[x][y]=true;
        printf("success\n");
    }
    else
    {
        flag[x][y]=false;
        printf("cancelled\n");
    }
} 
void newchecking(int x,int y)
{
    if(check[x][y]==false)
    {
        newcheck[x][y]=true;
        check[x][y]=true;
        checknumsum++;
        newchecknum++;
    }
    for(int k=0;k<8;k++)
    {
        if(flag[x+a[k][0]][y+a[k][1]]==true)
        {
            flag[x+a[k][0]][y+a[k][1]]==false;
        }
        if((x+a[k][0])>=1&&(x+a[k][0])<=n&&(y+a[k][1])>=1&&(y+a[k][1])<=m&&num[x+a[k][0]][y+a[k][1]]!=0&&check[x+a[k][0]][y+a[k][1]]==false)
        {
            newcheck[x+a[k][0]][y+a[k][1]]=true;
            check[x+a[k][0]][y+a[k][1]]=true;
            newchecknum++;
            checknumsum++;
        }
        if((x+a[k][0])>=1&&(x+a[k][0])<=n&&(y+a[k][1])>=1&&(y+a[k][1])<=m&&num[x+a[k][0]][y+a[k][1]]==0&&check[x+a[k][0]][y+a[k][1]]==false)
        {
            newchecking(x+a[k][0],y+a[k][1]);
        }
    }


}
void sweep(int x,int y)
{
    if(check[x][y]==true)
    {
        printf("swept\n");
    }
    else if(flag[x][y]==true)
    {
        printf("flagged\n");
    }
    else
    {
        if(map[x][y]=='*')
        {
            safe=0;
            printf("boom\n");
        } 
        else if(num[x][y]>0)
        {
            check[x][y]=true;
            checknumsum++;
            printf("1 cell(s) detected\n");
            printf("%d %d %d\n",x,y,num[x][y]);
        }
        else if(num[x][y]==0)
        {
            newchecknum=0;
            for(int i=1;i<n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    newcheck[i][j]=false;
                }
            }
            newchecking(x,y);
            printf("%d cell(s) detected\n",newchecknum);
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(newcheck[i][j]==true)
                    {
                        printf("%d %d %d\n",i,j,num[i][j]);
                    }
                }
            }
        }
    }
} 
void dsweep(int x,int y)
{
    int flagnum=0;
    for(int k=0;k<8;k++)
    {
        if(flag[x+a[k][0]][y+a[k][1]]==true)
        {
            flagnum++;
        }
    }
    if(check[x][y]==false)
    {
        printf("not swept\n");
    }

    else if(num[x][y]==0||flagnum!=num[x][y])
    {
        printf("failed\n");
    }
    else
    {
        newchecknum=0;
        for(int i=1;i<n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                newcheck[i][j]=false;
            }
        }
        for(int k=0;k<8;k++)
        {
            int temx=x+a[k][0];
            int temy=y+a[k][1];
            if(flag[temx][temy]==false)
            {
                if(map[temx][temy]=='*')
                {
                    printf("boom\n");
                    safe=0;
                    break;
                }
                else if(check[temx][temy]==false&&map[temx][temy]=='.')
                {
                    newcheck[temx][temy]=true;
                    check[temx][temy]=true;
                    newchecknum++;
                    checknumsum++;
                }
            }
        }
        if(safe==1)
        {
            printf("%d cells detected\n",newchecknum);
            for(int kk=0;kk<8;kk++)
            {
                if(newcheck[x+a[kk][0]][y+a[kk][1]]==true)
                {
                    printf("%d %d %d\n",x+a[kk][0],y+a[kk][1],num[x+a[kk][0]][y+a[kk][1]]);
                }
            }
        }

    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>map[i][j];
        }
    }
    getnum(); 
    string a;
    int x,y;
    int step=0;
    string b="Sweep";
    while(cin>>a)
    {

        if(a==b)
        {
            cin>>x>>y;
            sweep(x,y);
            step++;
            cout<<"num of checked:"<<checknumsum<<endl;
        }
        else if(a=="Flag")
        {
            cin>>x>>y;
            flaging(x,y);
            step++;
        }
        else if(a=="DSweep")
        {
            cin>>x>>y;
            dsweep(x,y); 
            step++;
            cout<<"num of checked:"<<checknumsum<<endl;
        }
        if(safe==0)
        {
            printf("game over\n");
            printf("total step: %d",step);
            return 0;
        }
        if(checknumsum==allxing)
        {
            printf("finish\n");
            printf("total step: %d",step);
            return 0;
        }
        if(a=="Quit")
        {
            printf("give up\n");
            printf("total step: %d",step);
            return 0;
        }




    }
}

有很多细节需要注意:
1、新探明
2、连锁
3、输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出6.12和6.13是关于赫夫曼编码的编码和解码算法。下面是对这两个算法的简要介绍: 6.12 赫夫曼编码算法 赫夫曼编码是一种可变长度编码,用于将字符编码为比特串。它是一种前缀编码,即没有任何一个字符的编码是另一个字符编码的前缀。这种编码方式可以有效地压缩数据,因为出现频率高的字符可以用较短的编码表示,而出现频率低的字符可以用较长的编码表示。 赫夫曼编码算法的基本思想是:根据字符出现的频率构建一棵赫夫曼树,然后对每个字符进行编码。具体步骤如下: 1. 统计每个字符出现的频率,并将它们存储在一个频率表中。 2. 将频率表中的每个字符作为一个叶子节点,构建一棵赫夫曼树。构建赫夫曼树的方法是:将频率最小的两个节点合并成一个新节点,新节点的权值为两个节点的权值之和。重复这个过程,直到所有节点都被合并成一个根节点。 3. 对赫夫曼树进行遍历,对每个字符生成一个编码。从根节点开始,如果向左走就在编码的末尾添加一个0,如果向右走就在编码的末尾添加一个1。当遍历到一个叶子节点时,就得到了该字符的编码。 4. 将每个字符的编码存储在一个编码表中。 6.13 赫夫曼解码算法 赫夫曼解码算法的基本思想是:根据赫夫曼编码表和赫夫曼树,将比特串解码为字符。具体步骤如下: 1. 从比特串的开头开始,沿着赫夫曼树向下走,直到遇到一个叶子节点。 2. 如果遇到的是一个叶子节点,就将该节点对应的字符输出,并返回到根节点。 3. 如果遇到的是一个内部节点,就根据比特串的下一位向左或向右走,重复步骤1和步骤2,直到遇到一个叶子节点。 --相关问题--: 1. 赫夫曼编码有哪些应用场景? 2. 如何实现赫夫曼编

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值