小地圖 - 第四屆全國中醫(yī)藥院校大學(xué)生程序設(shè)計競賽

問題描述

給定一個nm列的網(wǎng)格地圖灸叼,從上到下依次編號為第1行到第n行,從左往右依次編號為第1列到第m列鲸郊。每個格子要么可以通行(用.表示)赦肃,要么不可通行(用#表示)溅蛉。

玩家P現(xiàn)在位于某個可以通行的格子上,小地圖顯示出了玩家所在位置周圍3 * 3 = 9個格子他宛。請寫一個程序船侧,根據(jù)地圖和小地圖找到玩家可能所在的位置。

輸入

第一行包含一個正整數(shù)T(1 <= T <= 10)厅各,表示測試數(shù)據(jù)的組數(shù)镜撩。

每組測試數(shù)據(jù)第一行包含兩個正整數(shù)n,m(1 <= n,m <= 100),表示行數(shù)和列數(shù)队塘。

接下來n行袁梗,每行包含一個長度為m的字符串宜鸯,依次描述每一行每個格子的情況。字符串僅由.#構(gòu)成遮怜。

接下來3行淋袖,每行包含一個長度為3的字符串,描述玩家所在位置周圍的情況锯梁。字符串由.即碗、#P(表示玩家所在位置)和*(表示超出地圖的部分)構(gòu)成陌凳。輸入數(shù)據(jù)保證有且僅有一個P剥懒,且P一定位于小地圖的第2行第2列。

請注意:你不能旋轉(zhuǎn)/翻轉(zhuǎn)小地圖合敦。

輸出

對于每組數(shù)據(jù)初橘,輸出一行一個整數(shù),即玩家可能所在的位置的數(shù)量蛤肌。

樣例輸入

2
5 8
#.#....#
#.#..#..
.#..#.#.
#..###..
...#....
.#.
#P.
...
1 2
.#
***
*P#
***

樣例輸出

2
1

解題思路

硬核模擬壁却。

只要判斷一下邊界就行了,所以比較簡單裸准,直接給帶注釋的代碼即可。

代碼

注釋非常清晰了赔硫,肯定能懂炒俱。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <vector>
#include <list>
#include <set>
#include <utility> // pair
#include <map>
#include <iostream>
#include <sstream>
#include <algorithm> // sort
#include <string>
#include <stack>
#include <queue>
#include <fstream>

using namespace std;

#define ll long long
#define uchar unsigned char
#define ushort unsigned short
#define uint unsigned int
#define ulong unsigned long
#define ull unsigned long long

#define pi acos(-1)

#define mx(a,b) (a) > (b) ? (a) : (b)
#define mn(a,b) (a) < (b) ? (a) : (b)
#define mem(a,b) memset(a,b,sizeof(a))
#define fre(a) freopen(a,"r",stdin)

#define itn int
#define nit int
#define inr int
#define mian main
#define ednl endl
#define fro for
#define fir for
#define reutrn return
#define retunr return

char a[110][110];
char p[5][5];
int m,n;

int dx[] = {-1,-1,1,1,1,-1,0,0}; // 8個方向
int dy[] = {-1,0,0,-1,1,1,-1,1}; // 8個方向

int chk(int x,int y)
{
    if (a[y][x] == '#') return 0; // 如果玩家在墻上,直接0
    int xx,yy; // 玩家四周的坐標(biāo)
    for (int i = 0;i < 8;i ++)
    {
        xx = x + dx[i]; // 玩家周圍坐標(biāo)的x
        yy = y + dy[i]; // 玩家周圍坐標(biāo)的y
        if (xx >= 0 && xx < m && yy >= 0 && yy < n) // 如果玩家周圍一圈在地圖內(nèi)
        {
            if (a[yy][xx] != p[1 + dy[i]][1 + dx[i]]) return 0; // 直接判斷和我們要的一不一樣即可
        } else {
            if (p[1 + dy[i]][1 + dx[i]] != '*') return 0; // 在墻外也判一下
        }
    }
    return 1; // 沒問題當(dāng)然true
}

int main()
{
    int T;
    scanf("%d",&T);
    while (T --)
    {
        // 各種輸入
        scanf("%d %d",&n,&m);
        for (int i = 0;i < n;i ++)
        {
            scanf(" ");
            for (int j = 0;j < m;j ++)
            {
                scanf("%c",&a[i][j]);
            }
        }
        for (int i = 0;i < 3;i ++)
        {
            scanf(" ");
            for (int j = 0;j < 3;j ++)
            {
                scanf("%c",&p[i][j]);
            }
        }
        // 定義開始判斷的x軸的start和end爪膊,y軸的start和end
        int xs = 1,ys = 1,xe = m - 1,ye = n - 1; // 由于沒有*的時候玩家不可能在邊緣出現(xiàn)权悟,所以他們一定是從1(數(shù)組從0開始)開始走,到邊界處-1推盛,注意這邊的end是不包括的峦阁,還是左閉右開區(qū)間。
        /* 例如:
         *     #..#..#
         *     #....#.
         *     ###...#
         *     #......
         * 玩家可能的活動范圍只有中間的:
         *      ...#.
         *      ##...
         * x軸也就是[1,5]
         * y軸是[1,2]
         */
        
        // 如果是*耘成,那么就得從邊界開始了
        if (p[0][1] == '*') ys --;
        if (p[1][0] == '*') xs --;
        if (p[2][1] == '*') ye ++;
        if (p[1][2] == '*') xe ++;
        // 當(dāng)然邊界的話循環(huán)的時候可以只判斷邊界榔昔,由于這題數(shù)據(jù)不是很大,所以后面直接硬核模擬整個也沒問題
        
        int cnt = 0; // 計數(shù)
        for (int i = ys;i < ye;i ++)
        {
            for (int j = xs;j < xe;j ++)
            {
                if (chk(j, i)) cnt ++; // 檢查
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘪菌,一起剝皮案震驚了整個濱河市撒会,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌师妙,老刑警劉巖诵肛,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異默穴,居然都是意外死亡怔檩,警方通過查閱死者的電腦和手機(jī)褪秀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薛训,“玉大人媒吗,你說我怎么就攤上這事⌒肀停” “怎么了蝴猪?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膊爪。 經(jīng)常有香客問我自阱,道長,這世上最難降的妖魔是什么米酬? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任沛豌,我火速辦了婚禮,結(jié)果婚禮上赃额,老公的妹妹穿的比我還像新娘加派。我一直安慰自己,他們只是感情好跳芳,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布芍锦。 她就那樣靜靜地躺著,像睡著了一般飞盆。 火紅的嫁衣襯著肌膚如雪娄琉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天吓歇,我揣著相機(jī)與錄音孽水,去河邊找鬼。 笑死城看,一個胖子當(dāng)著我的面吹牛女气,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播测柠,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炼鞠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹃愤?” 一聲冷哼從身側(cè)響起簇搅,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎软吐,沒想到半個月后瘩将,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年姿现,在試婚紗的時候發(fā)現(xiàn)自己被綠了肠仪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡备典,死狀恐怖异旧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情提佣,我是刑警寧澤吮蛹,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拌屏,受9級特大地震影響潮针,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倚喂,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一每篷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧端圈,春花似錦焦读、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宴倍,卻和暖如春喧兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啊楚。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留浑彰,地道東北人恭理。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像郭变,于是被迫代替她去往敵國和親颜价。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容