UVa的扫雷(10189)

时间:2015-08-10 13:18:55

标签: java algorithm runtime-error

我在解决扫雷问题时遇到问题,因为我得到的索引不受限制,无法找出原因: Here is the link of the problem

我认为我的代码并不完全有效,但我只想解决这个问题,这里是代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Mine_Sweepers {

    public static void main(String [] args) throws IOException
    {
       BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));

      //Taking the dimensions of the grid...

      StringTokenizer s=new StringTokenizer(bf.readLine());
      int b=Integer.parseInt(s.nextToken()), a=Integer.parseInt(s.nextToken());
      while(b!=0 && a!=0)
      { 
            mine(b,a);
            s=new StringTokenizer(bf.readLine());
            b=Integer.parseInt(s.nextToken());   
            a=Integer.parseInt(s.nextToken());
      }
   }
      public static void mine(int b,int a) throws IOException
      {

            BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
            boolean array_first=false,array_last=false,string_first=false,string_last=false;

            String []x=new String[a];

            for(int i=0;i<a;i++)
                x[i]=bf.readLine();
            for(int i=0;i<a;i++)
            {
               //Here I am checking whether this is the first field in the array or if it is the last
                array_first=(i==0)?true:false;
                array_last=(i==a-1)?true:false;
                for(int j=0; j<b; j++)
                {
                   //Here I am checking whether this is the first char in the String in the array or if it is the last
                   string_first=(j==0)?true:false;
                   string_last=(j==a-1)?true:false;
                   int counter=0; 
                   if(x[i].charAt(j)!='*')
                   {

                      if(!string_first)
                      {
                         if(x[i].charAt(j-1)=='*')
                            counter++;
                            if(!array_first & x[i-1].charAt(j-1)=='*')
                                counter++;
                                if(!array_last & x[i+1].charAt(j-1)=='*')
                                   counter++;

                      }
                      if(!string_last )
                      {
                            if(x[i].charAt(j+1)=='*')
                                counter++;
                                if(!array_first && x[i-1].charAt(j+1)=='*')
                                    counter++;
                                    if(!array_last & x[i+1].charAt(j+1)=='*')
                                    counter++;
                     }
                     if(!array_first & x[i-1].charAt(j)=='*')
                        counter++;

                        if(!array_last & x[i+1].charAt(j)=='*')
                            counter++;

                            System.out.print(counter);
                     }
                     else
                        System.out.print('*');
                }
                System.out.println();
            }
        }

    }

1 个答案:

答案 0 :(得分:1)

您正在使用&does not shortcircuit

if(!array_first & x[i-1].charAt(j+1)=='*')

所以 !array_firstx[i-1].charAt(j+1)=='*'都会被评估,无论如何。您希望第二部分仅在第一部分评估为真时进行评估,因此如果!array_first为假(因此array_first为真),则其余部分不会被评估(因为如果是,{{1将是否定的,你将得到一个错误)。请使用i-1。不只是在这条线上,而是在任何地方。

如果使用以下模式:

&&

您应始终使用if <valid indexes> and <access to those indexes>: do work 作为逻辑&&运算符。