(紀中)2172. 掃雷(mine)

(File IO): input:mine.in output:mine.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet


題目描述
WindowsWindows中的掃雷遊戲是大家都熟悉的小遊戲,今天,味味也設計了一個簡易的掃雷遊戲。味味設計的掃雷遊戲功能如下:
一、程序一開始會讀入掃雷區域大小nn,表示遊戲區域有nnn*n個小方格組成,接下來會讀入nn行信息,每行有nn個整數(每個整數可能是00,也可能是11),每兩個整數之間用一個空格分隔。其中00 所在位置表示該小方格內沒有地雷,11 所在位置表示該小方格內有地雷(遊戲開始時,掃雷區域中必定包含至少一個地雷)。接下來每行輸入兩個用空格分開的正整數iijj,每一行的一對iijj表示用戶用鼠標單擊掃雷區域中第ii 行第jj 列位置上的小方格(就象我們使用WindowsWindows中掃雷遊戲一樣),iijj 表示的位置必定在掃雷區域內。程序每輸入一對i和jj,就馬上進行相應的處理(就象我們在WindowsWindows 中鼠標單擊某個小方塊就會出現結果一樣)。
二、程序將根據讀入的一組iijj的值來對掃雷區域作相應處理,具體的處理規則如下:
(1)如果iijj 表示的小方格內沒有地雷、而且也沒有被處理過(就是第i行第j 列的數值是00),那麼將以該小方格爲中心的一個正方形區域內所有沒有地雷的小方格都賦值爲1-1(表示該區域的地磚已經被掀開了)。如果在當前正方形區域內有一個位置號爲i1i1j1j1(注意:i1<>ii1<>i並且j1<>jj1<>j)的小方格內恰好有地雷,則此地雷就被順利掃除,將該位置標記爲2-2。如果該正方形區域內某些小方格已經被處理過,則對這些小方格不再做任何處理。舉個例子來說明一下,假如輸入信息如上圖左邊所示,那麼處理結果就如右邊所示。
(2)如果iijj 表示的小方格已經被處理過(就是第ii 行第jj 列的數值是1-1 或者是2-2),那麼不作任何處理,繼續去讀取下一行的iijj 的值。
(3)如果iijj 表示的小方格剛好有地雷,並且該小方格沒有被處理過(就是第ii 行第jj 列的數值是11),那麼表示用戶觸雷,馬上輸出信息GAMEOVER!“GAME OVER!”,程序結束。
三、如果在讀入iijj的過程中一直沒有觸雷,那麼就一直按照位置信息處理下去,直到滿足下列條件之一,就輸出相應信息並結束程序:
(1)讀入的i和j的值都是00(表示用戶不再在某個小方格內單擊鼠標右鍵了),則輸出處理後整個掃雷區域的狀態(就是輸出nnnn列的方陣,每行中兩個整數之間用一個空格分隔,末尾沒有多餘空格),然後程序結束。
(2)如果某次處理完後,遊戲區域內所有的地雷都被掃除了,那麼不必再讀入下一行的信息,輸出信息YOUAREWINNER!“YOU ARE WINNER!”,程序結束。


輸入
輸入文件名爲mine.inmine.in。第一行一個整數nn<=50n(n<=50),接下來是一個nnn*n 的方陣。再接下來是若干行,每行空格分隔的兩個整數,表示i和j,以000 0結束。

輸出
輸出文件名爲mine.outmine.out。包含一行,可能輸出YOUAREWINNER!“YOU ARE WINNER!”,可能輸出GAMEOVER!“GAME OVER!”,
也可能輸出一個處理後的方陣。


樣例輸入
【樣例輸入1】
6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
5 2
2 3
0 0

【樣例輸入2】
6
0 0 0 0 0 0
0 0 1 0 0 0
1 0 0 0 1 0
0 0 0 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
1 1
3 4
5 5
4 6
2 3
0 0

樣例輸出
【樣例輸出1】
GAME OVER!

【樣例輸出2】
-1 -1 0 0 0 0
-1 -1 -2 -1 -1 0
1 0 -1 -1 -2 0
0 0 -1 -1 -1 -1
0 1 0 -1 -1 -2
0 0 0 -1 -1 -1


數據範圍限制


解題思路
大模擬


代碼

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,a[60][60],x,y,xx,yy;
const int d[9][2]= {1, 0, 0, 1, -1, 0, 0, -1, 1, 1, 1, -1, -1, 1, -1, -1, 0, 0};
int check()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(a[i][j]>0)
                return 0;
    return 1;
}
int main()
{
    freopen("mine.in","r",stdin);
    freopen("mine.out","w",stdout);
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
            scanf("%d",&a[i][j]);
    }
    while(scanf("%d%d",&x,&y))
    {
        if(x==0&&y==0)
        {
            for(int i=1; i<=n; i++)
            {
                for(int j=1; j<=n; j++)
                    printf("%d ",a[i][j]);
                printf("\n");
            }
            return 0;
        }
        if(a[x][y]==1)
        {
            printf("GAME OVER!\n");
            return 0;
        }
        else if(a[x][y]==0)
        {
            for(int i=0; i<9; i++)
            {
                xx=x+d[i][0];
                yy=y+d[i][1];
                if(a[xx][yy]>=0&&xx>0&&yy>0&&xx<=n&&yy<=n)
                {
                    for(int i=1; i<=9; i++)
                    {
                        if(a[xx][yy]==1)
                            a[xx][yy]=-2;
                        else if(a[xx][yy]==0)
                            a[xx][yy]=-1;
                    }
                }
            }
        }
        if(check())
        {
            printf("YOU ARE WINNER!\n");
            return 0;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章