Friday, August 19, 2016

UVA 10189 - Minesweeper solution

problem link-click here

This problem is easy just think it as easiest problem because this is an implementation based problem. now let's come to the main point.

you have to output the number of mines in the cell which is not a mine. The most simple way to do this is to reset your matrix and just add to all adjacent cells if a mine is found and also tag whether or not a cell is a mine or not. remember there is 8 adjacent square box for each mine.

an accepted output is as follows:

#include<bits/stdc++.h>
using namespace std;

int main()
{
     int n,m,t,k=1;

     while( scanf("%d%d",&n,&m)==2)
     {
         if((m!=0 && n!=0) && k!=1)
         {
             printf("\n");
         }
         else if(m==0 && n==0)
         {
             break;
         }

         string str[110];

         for(int i=0;i<n;i++)
         {
            cin>>str[i];
         }

         for(int i=0;i<n;i++)
         {
             for(int j=0;j<m;j++)
             {
                 if(str[i][j]=='.')
                 {
                     str[i][j]='0';
                 }
             }
         }

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(str[i][j]=='*')
                {
                    if(((i-1)>=0 && (j-1)>=0) && str[i-1][j-1]!='*')
                    {
                        str[i-1][j-1]=str[i-1][j-1]+1;
                    }

                    if(((i>=0 && (j-1)>=0)) && (str[i][j-1]!='*'))
                    {
                        str[i][j-1]=str[i][j-1]+1;
                    }

                    if(((i-1)>=0 && j>=0) && (str[i-1][j]!='*'))
                    {
                        str[i-1][j]=str[i-1][j]+1;
                    }

                    if(((i-1)>=0 && j+1<m) && str[i-1][j+1]!='*')
                    {
                        str[i-1][j+1]=str[i-1][j+1]+1;
                    }

                    if((i>=0 && j+1<m) &&  str[i][j+1]!='*')
                    {
                        str[i][j+1]=str[i][j+1]+1;
                    }

                    if((i+1<n && j+1<m) && str[i+1][j+1]!='*')
                    {
                        str[i+1][j+1]=str[i+1][j+1]+1;
                    }

                    if((i+1<n && j<m) && str[i+1][j]!='*')
                    {
                        str[i+1][j]=str[i+1][j]+1;
                    }

                    if((i+1<n && j-1>=0) && str[i+1][j-1]!='*')
                    {
                        str[i+1][j-1]=str[i+1][j-1]+1;
                    }
                }
            }
        }

        printf("Field #%d:\n",k);

        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cout<<str[i][j];
            }

            cout<<endl;
        }

         k++;
     }

     return 0;
}

No comments:

Post a Comment