一个采用BF算法的宝石迷阵的消除解法
剛學C++編程一個多月,我就是個渣渣啊,算法啊數據結構啊基礎為負。
測試輸入為
2//有幾次測試 4?5//地圖規模,4行5列,都是自己輸入的,可以更改的 .D.M. .DCAE .AABA MDDAM//創建地圖,'.'代表沒有元素 2?3?2?4//交換(2,3)(2,4),注意左上角為(0,0) 2?4 //第二次測試 F.Z. ZZAZ 1?2?0?2輸出應該為消除了多少個寶石 8//第一次消除了8個,就跟普通的消除游戲一樣嘛 4
這個采用最直接打辦法解決的寶石迷陣消除算法,里面的代碼亂七八糟的,等我學點算法再回來看吧。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
int result = 0;
int judge(char **Map, int row, int col);
void createElement(char **Map, int row, int col);
void showMap(char **Map, int row, int col);
int countSpace(char **Map, int row, int col);
int main()
{
? ? int testPoint = 0;
? ? cin >> testPoint;
? ? for ( int i = 0; i < testPoint; ++i)
? ? {
? ? ? ? int row = 0;
? ? ? ? cin >> row;
? ? ? ? int col = 0;
? ? ? ? cin >> col;
? ? ? ? //分配內存
? ? ? ? char **Map = new char*[row +1];
? ? ? ? for (int i = 0; i < row; ++i)
? ? ? ? {
? ? ? ? ? ? Map[i] = new char[col + 1];
? ? ? ? }
? ? ? ? for (int i = 0; i < row; ++i)
? ? ? ? ? ? for (int j =0; j < col; ++j)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cin >> Map[i][j];
? ? ? ? ? ? }
? ? ? ? int x1, y1, x2, y2;
? ? ? ? cin >> x1 >> y1;
? ? ? ? cin >> x2 >> y2;
? ? ? ? char temp = Map[x1][y1];
? ? ? ? Map[x1][y1] = Map[x2][y2];
? ? ? ? Map[x2][y2] = temp;
? ? ? ?// cout << "Log : exchange.\n";
? ? ? ? int first = countSpace(Map, row, col);
? ? ? ? int x = judge(Map, row, col);
? ? ? ? int last = countSpace(Map, row, col);
? ? ? ? cout << last - first << endl;
? ? }
? ? return 0;
}
int judge(char **Map, int row, int col)
{
? ? vector<char *> vCharTemp;
? ? //遍歷檢查是否有需要被刪除的元素
? ? //檢查每一橫排,把三個以上相同的放入容器,做邊界檢測
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? for (int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? if (Map[i][j] == '.')
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (j + 2 >= col)
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (Map[i][j] != Map[i][j+1])
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (Map[i][j] != Map[i][j+2])
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? vCharTemp.push_back(&Map[i][j]);
? ? ? ? ? ? vCharTemp.push_back(&Map[i][j+1]);
? ? ? ? ? ? vCharTemp.push_back(&Map[i][j+2]);
? ? ? ? ? ? //TODO下一次檢測可以直接越過這三個元素
? ? ? ? ? ? if (j + 3 < col && Map[i][j] == Map[i][j+3])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? vCharTemp.push_back(&Map[i][j+3]);
? ? ? ? ? ? ? ? if (j + 4 < col && Map[i][j] ==Map[i][j+4])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? vCharTemp.push_back(&Map[i][j+4]);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //cout << "Log : check the col.\n";
? ? //檢查每一豎列
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? for (int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? if (Map[i][j] == '.')
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (i + 2 >= row)
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (Map[i][j] != Map[i+1][j])
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? if (Map[i][j] != Map[i+2][j])
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? vCharTemp.push_back(&Map[i][j]);
? ? ? ? ? ? vCharTemp.push_back(&Map[i+1][j]);
? ? ? ? ? ? vCharTemp.push_back(&Map[i+2][j]);
? ? ? ? ? ? if (i + 3 < row && Map[i][j] == Map[i+3][j])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? vCharTemp.push_back(&Map[i+3][j]);
? ? ? ? ? ? ? ? if (i + 4 < row && Map[i][j] == Map[i+4][j])
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? vCharTemp.push_back(&Map[i+4][j]);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //cout << "Log : check the row.\n";
? ? //根據容器的大小統計這一輪一共消除了多少個,如果存在指向相同的元素的指針只計算一次。
? ? auto end_unique = unique(vCharTemp.begin(), vCharTemp.end());
? ? vCharTemp.erase(end_unique, vCharTemp.end());//剔除相同的元素
? ? result += vCharTemp.size();
? ? if (vCharTemp.size() == 0)//如果容器里面一個元素都沒有,則返回結果
? ? {
? ? ? ? return result;
? ? }
? ? //已經將需要消除的放進容器里面了,然后將他們全部置為'.'
? ? for (auto mem : vCharTemp)
? ? ? ? *mem = '.';
? ? //cout << "Log : delete the same element.\n";
? ? //現在解決下落的問題,從下往上遍歷,如果元素是'.'且上面不是'.'就將他們跟'.'調換
? ? int cunt = 0;
? ? do
? ? {
? ? ? ? cunt++;
? ? ? ? for (int i = row - 1; i > 0; --i)//臥槽這兒寫成 ++i了
? ? ? ? {
? ? ? ? ? ? for (int j = 0; j < col; ++j)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //怎么解決連續的'.'呢,從上往下再遍歷一次?外面在加一個循環貌似可以解決
? ? ? ? ? ? ? ? if (Map[i - 1][j] != '.' && Map[i][j] == '.')
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? char temp = Map[i - 1][j];
? ? ? ? ? ? ? ? ? ? Map[i - 1][j] = Map[i][j];
? ? ? ? ? ? ? ? ? ? Map[i][j] = temp;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }while (cunt < row);//直至'.'到最上面
? ?// cout << "Log : Drop the element.\n";
? ? //現在地圖已經重新生成且'.'都在上面,先重新生成新元素替換'.'
? ? showMap(Map, row, col);
? ? //createElement(Map, row, col);
? ? //showMap(Map, row, col);
? ? //遞歸調用判斷新地圖是否存在可以消除的元素,直至容器大小為0;
? ? int x = judge(Map, row, col);
? ??
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? delete Map[i];
? ? }
}
void createElement(char **Map, int row, int col)
{
? ? srand(time(0));
? ?// cout << "Log : create new map.\n";
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? for (int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? if (Map[i][j] == '.')
? ? ? ? ? ? {
? ? ? ? ? ? ? ? int key = rand() % 26;
? ? ? ? ? ? ? ? Map[i][j] = 'A' + key;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
void showMap(char **Map, int row, int col)
{
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? ?for(int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? cout << Map[i][j];
? ? ? ? }
? ? ? ? cout << endl;
? ? }
? ? cout << "-----" << endl;
}
int countSpace(char **Map, int row, int col)
{
? ? int cunt = 0;
? ? for (int i = 0; i < row; ++i)
? ? {
? ? ? ? for (int j = 0; j < col; ++j)
? ? ? ? {
? ? ? ? ? ? if (Map[i][j] == '.')
? ? ? ? ? ? ? ? cunt++;
? ? ? ? }
? ? }
? ? return cunt;
}
總結
以上是生活随笔為你收集整理的一个采用BF算法的宝石迷阵的消除解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下一个10年,可能改变世界的5项重大发现
- 下一篇: linux打开共享文件