(File IO): input:mine.in output:mine.out
時間限制: 1000 ms 空間限制: 262144 KB 具體限制
Goto ProblemSet
題目描述
中的掃雷遊戲是大家都熟悉的小遊戲,今天,味味也設計了一個簡易的掃雷遊戲。味味設計的掃雷遊戲功能如下:
一、程序一開始會讀入掃雷區域大小,表示遊戲區域有個小方格組成,接下來會讀入行信息,每行有個整數(每個整數可能是,也可能是),每兩個整數之間用一個空格分隔。其中 所在位置表示該小方格內沒有地雷, 所在位置表示該小方格內有地雷(遊戲開始時,掃雷區域中必定包含至少一個地雷)。接下來每行輸入兩個用空格分開的正整數和,每一行的一對和表示用戶用鼠標單擊掃雷區域中第 行第 列位置上的小方格(就象我們使用中掃雷遊戲一樣),和 表示的位置必定在掃雷區域內。程序每輸入一對i和,就馬上進行相應的處理(就象我們在 中鼠標單擊某個小方塊就會出現結果一樣)。
二、程序將根據讀入的一組 和的值來對掃雷區域作相應處理,具體的處理規則如下:
(1)如果和 表示的小方格內沒有地雷、而且也沒有被處理過(就是第i行第j 列的數值是),那麼將以該小方格爲中心的一個正方形區域內所有沒有地雷的小方格都賦值爲(表示該區域的地磚已經被掀開了)。如果在當前正方形區域內有一個位置號爲和(注意:並且)的小方格內恰好有地雷,則此地雷就被順利掃除,將該位置標記爲。如果該正方形區域內某些小方格已經被處理過,則對這些小方格不再做任何處理。舉個例子來說明一下,假如輸入信息如上圖左邊所示,那麼處理結果就如右邊所示。
(2)如果 和 表示的小方格已經被處理過(就是第 行第 列的數值是 或者是),那麼不作任何處理,繼續去讀取下一行的和 的值。
(3)如果和 表示的小方格剛好有地雷,並且該小方格沒有被處理過(就是第 行第 列的數值是),那麼表示用戶觸雷,馬上輸出信息,程序結束。
三、如果在讀入和的過程中一直沒有觸雷,那麼就一直按照位置信息處理下去,直到滿足下列條件之一,就輸出相應信息並結束程序:
(1)讀入的i和j的值都是(表示用戶不再在某個小方格內單擊鼠標右鍵了),則輸出處理後整個掃雷區域的狀態(就是輸出行列的方陣,每行中兩個整數之間用一個空格分隔,末尾沒有多餘空格),然後程序結束。
(2)如果某次處理完後,遊戲區域內所有的地雷都被掃除了,那麼不必再讀入下一行的信息,輸出信息,程序結束。
輸入
輸入文件名爲。第一行一個整數,接下來是一個 的方陣。再接下來是若干行,每行空格分隔的兩個整數,表示i和j,以結束。
輸出
輸出文件名爲。包含一行,可能輸出,可能輸出,
也可能輸出一個處理後的方陣。
樣例輸入
【樣例輸入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;
}
}
}