枚舉(窮舉)算法-炸彈人(初級(jí)版)

規(guī)則

用放置炸彈的方法來(lái)消滅敵人,,須將畫面上的敵人全部消滅后并找到隱藏在墻里的暗門才能過(guò)關(guān)。


游戲圖片

題目要求

現(xiàn)有一個(gè)特殊關(guān)卡,只有一枚炸彈,但是這枚炸彈威力超強(qiáng)(炸彈的爆炸方向是沿上下左右四個(gè)方向),請(qǐng)問(wèn)放在那里可以消滅最多的敵人

分析

本實(shí)驗(yàn)使用枚舉算法(又叫做窮舉算法)

  1. 先將整個(gè)地圖模型化,墻用#表示,這里有兩種墻,可以被炸和不可以被炸,但是現(xiàn)在由于只有一枚炸彈且炸彈不能穿墻,所以都可以看成不可以被炸的。敵人用G表示,空地用 . 表示,炸彈只能放在空地上


    模型化的地圖
  2. 需要用一個(gè)二維字符數(shù)組來(lái)存儲(chǔ)這個(gè)地圖,至于將炸彈放置在哪一個(gè)點(diǎn)可以消滅敵人最多,則需要一個(gè)個(gè)來(lái)嘗試,注意,這里說(shuō)的坐標(biāo)(x,y)指的是x行y列
  3. 如何分別統(tǒng)計(jì)上下左右四個(gè)方向上可以消滅的敵人數(shù)?只要搞清一個(gè)方向,其他的方向都是一樣的。向下統(tǒng)計(jì)為例,向下就是y不變,x每次增加1,直到遇到墻為止
while(a[x][y]!='#')
{
 if(a[x][y] == 'G')
   sun++;    //如果可以消滅一個(gè)敵人就sum++
 x++;繼續(xù)向下
}
  1. 另外幾個(gè)方向進(jìn)行統(tǒng)計(jì)的坐標(biāo)變化如下:


    坐標(biāo)變化
  2. 統(tǒng)計(jì)哪個(gè)空地坐標(biāo)在四個(gè)方向上消滅的敵人最多

注意:此算法沒(méi)有考慮炸彈人是否能到達(dá)該空地

代碼:

#include <stdio.h>

int main(void)
{
    int n = 13,m = 13;//n行m列
    char a[13][13] = {
        "#############",
        "#GG.GGG#GGG.#",
        "###.#G#G#G#G#",
        "#.......#..G#",
        "#G#.###.#G#G#",
        "#GG.GGG.#.GG#",
        "#G#.#G#.#.###",
        "##G...G.....#",
        "#G#.#G###.#G#",
        "#...G#GGG.GG#",
        "#G#.#G#G#.#G#",
        "#GG.GGG#G.GG#",
        "#############"
    };
    int i,j,sum,map = 0,p,q,x,y;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
            //首先判斷這個(gè)點(diǎn)是否是平地,只有平地才能被防止炸彈
            if(a[i][j] == '.')
            {
                //sum用來(lái)計(jì)數(shù)(可以消滅的敵人數(shù)),需初始化為0
                sum = 0;
                
                //將當(dāng)前坐標(biāo)i,j復(fù)制到兩個(gè)新變量x,y中,以便向上下左右四個(gè)方向分別統(tǒng)計(jì)可以消滅的敵人數(shù)
                
                //向上統(tǒng)計(jì)
                x = i;
                y = j;
                //判斷是不是墻,不是就繼續(xù)
                while(a[x][y]!= '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //向上統(tǒng)計(jì)
                    x--;
                }
                
                //向下統(tǒng)計(jì)
                x = i;
                y = j;
                //判斷是不是墻,不是就繼續(xù)
                while(a[x][y]!= '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //向下統(tǒng)計(jì)
                    x++;
                }
                
                //向左統(tǒng)計(jì)
                x = i;
                y = j;
                //判斷是不是墻,不是就繼續(xù)
                while(a[x][y]!= '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //向左統(tǒng)計(jì)
                    y--;
                }
                
                //向右統(tǒng)計(jì)
                x = i;
                y = j;
                //判斷是不是墻,不是就繼續(xù)
                while(a[x][y]!= '#')
                {
                    if(a[x][y] == 'G')
                        sum++;
                    //向右統(tǒng)計(jì)
                    y++;
                }
                
                //更新map的值,并保存坐標(biāo)
                if(sum > map)
                {
                    map = sum;
                    p = i;
                    q = j;
                }
                
            }
        }
    }
    printf("Bomb set(%d,%d),Destroy the enemy at most:%d",p,q,map);
    
    getchar();
    return 0;
    
}

結(jié)果:

Bomb set(9,9),Destroy the enemy at most:8
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容