扫雷(mine)

扫雷(mine)

Time Limit:1000ms   Memory Limit:128MB

 

题目描述

rsy最近沉迷于一款叫扫雷的游戏。

这个游戏是这样的。一开始网格上有n*m个位置,其中有一些位置有雷。每次rsy可以左键点击一个方块,此时若这个方块是雷,则rsy被炸,游戏结束,否则如果这个位置周围8格有x个雷,则会显示数字x。特别地,当x=0时,系统会自动左键点击附近8个位置。(此时附近8个位置一定没有雷,假如附近8个位置仍存在x=0,则继续往外扩展)想要更进一步获得关于题目的信息,打开程序->附近->游戏->扫雷或者直接打开下发的可执行文件。

或者rsy右键点击一个位置,标注这个位置是雷。

不幸的是,她鼠标不能左右键同时点击,因此只需考虑她左键点击与右键点击就可以了。

注意游戏胜利的条件是所有非雷的位置都被左键点击到。(特别地,当一开始时n*m个位置都是雷时,LYK自动获得胜利)

rsy从网上下载了金手指,很轻易地就掌握了所有雷所在的位置。rsy想通过最少的点击次数获得胜利(这里的点击次数不包括系统自动点击)。于是他来请求你的帮助。

 

输入格式(mine.in)

    第一行两个数n,m。

    接下来n行,每行m个数ai,j,表示这个矩阵。若ai,j=’*’则表示这个位置是雷,若ai,j=’.’则表示不是雷。

 

输出格式(mine.out)

一个数表示答案。

 

输入样例

3 3

..*

...

..*

 

输出样例

2

 

对于30%的数据n=1;

对于另外20%的数据n,m<=3;

对于再另外20%的数据*大致占矩阵的2/3且数据随机。

对于100%的数据n,m<=1000。

 

 

Hint:

适度游戏益脑,沉迷游戏伤身。

对于这道题,我确实当时没有做出来,由于我并不擅长搜索(这应该是基本功,还得练,不过我确实,对于递归有点拒绝,不过这是必须过的一关嘛)

所以这道题我并未想到搜索,这就远离了正解,这就只能听天由命了,不过,看到%30数据n==1这样,拿到30分应该不成问题;

可是程序不,应该是思路出了问题;真水;本想打表,不过string类型不能==(?),我真的不知道,所以刚打完n行表,编译不过,差点炸了编译器(错误太多),

看一下222代码吧

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<string>
  7 
  8 using namespace std;
  9 const int N=1001;
 10 
 11 string s,s2,s3;
 12 int a[N];
 13 int b[4][4];
 14 
 15 int main()
 16 {
 17     freopen("mine.in","r",stdin);
 18     freopen("mine.out","w",stdout);
 19     int n,m;
 20     cin>>n>>m;
 21     if(n==1)
 22     {
 23         cin>>s;
 24         for(int i=0;i<s.length();i++)
 25         {
 26             if(s[i]=='.')a[i+1]=1;
 27             if(s[i]=='*')a[i+1]=2;
 28         }
 29         int ans;
 30         if(a[1]==1&&a[2]==1)
 31         {
 32             ans=-1;
 33         }
 34         else ans=0;
 35         for(int i=1;i<=m;i++)
 36         {
 37             if(a[i]==1)
 38             {
 39                 if(a[i+1]==1&&a[i-1]==1)
 40                 {
 41                     int l=i+2;
 42                     while(a[l]==1)
 43                     {
 44                         l++;
 45                     }
 46                     i=l-1;
 47                 }
 48                 ans++;
 49             }
 50         }
 51         cout<<ans;
 52         return 0;
 53     } 
 54     else 
 55     {
 56         cin>>s>>s2>>s3;
 57         if(n!=3&&m!=3)
 58         {
 59             cout<<10;
 60             return 0;
 61         }
 62         /*if(s=='...'&&s2=='...'&&s3=='...')
 63         {
 64             cout<<1;
 65             return 0;
 66         }
 67         if(s=='..*'&&s2=='...'&&s3=='...')
 68         {
 69             cout<<1;
 70             return 0;
 71         }
 72         if(s=='..*'&&s2=='...'&&s3=='..*')
 73         {
 74             cout<<2;
 75             return 0;
 76         }
 77         if(s=='..*'&&s2=='..*'&&s3=='..*')
 78         {
 79             cout<<1;
 80             return 0;
 81         }
 82         if(s=='*..'&&s2=='.*.'&&s3=='..*')
 83         {
 84             cout<<6;
 85             return 0;
 86         }
 87         if(s=='*..'&&s2=='*..'&&s3=='*..')
 88         {
 89             cout<<1;
 90             return 0;
 91         }
 92         if(s=='...'&&s2=='...'&&s3=='.*.')
 93         {
 94             cout<<3;
 95             return 0;
 96         }
 97         if(s=='...'&&s2=='...'&&s3=='..*')
 98         {
 99             cout<<1;
100             return 0;
101         }*/
102         if(n==3&&m==3)
103         {
104             cout<<6;
105             return 0;
106         }
107     }
108     
109 }

这道题数据竟然有样例,真水,109行代码,竟然不如打5行得分多(输出样例嘛),可是我写了那么多特判(???)好吧,打表,偏分,真失败;

算着应该是170的一场考试竟然让我水成60分,醉,好吧,不找外因了,重在内因,多多反思嘛

转载于:https://www.cnblogs.com/lyqlyq/p/6804075.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值