演算法 求最大公倍數和走迷宮

2021-09-27 06:28:50 字數 3716 閱讀 2723

大資料用:longlong

如果輸入0,0標誌結束輸入:while (scanf("%lld%lld", &n, &m), n&&m)

求最大公倍數:

long long fun(long long n, long long m)

result = x / m;

return result;

}

description

有乙個n*m的格仔迷宮,1代表該格仔為牆,不能通過,0代表可以通過,另外,在迷宮中

有一些傳送門,走到傳送門的入口即會自動被傳送到傳送門的出口(一次傳送算1步)。人在迷宮中可以嘗試

上下左右四個方向移動。現在給定乙個迷宮和所有傳送門的出入口,以及起點和終點,

問最少多少步可以走出迷宮。如果不能走出迷宮輸出「die」。

輸入格式

該程式為多case,第1行為case的數量

每乙個case,第1行為兩個數n(行)和m(列)

然後n行每行m個數

之後是乙個數w,為傳送門的數量

之後每行乙個傳送門的入口座標c1(行),r1(列)和出口座標c2,r2

之後是起點座標和終點座標sc(行) sr(列) ec(行) er(列)

注:傳送門出入口和起點座標和終點座標不會出現在牆的位置

所有數字不超過100

2 case數

4 3 n*m

011011

110110

1 傳送門數

1 0 2 2 傳送門的入口座標trar(行),trac(列)和出口座標arriver,arrivec

0 0 3 2 起點座標和終點座標starr(行), starc(列)和 endr(行) endc(列)

2 201100

0 0 1 1

心得:bfs的關鍵是queue的應用,在此處的step代替了visited的作用,原因是只能上下左右移動一步,相當於圖中的定點與周圍距離為1的頂點可以聯通

輸入地圖時沒有空格,所以map的資料型別應該是char

注意使用row和col而非使用x和y

用陣列模擬上下左右的座標變化,並用變數i來控制

注意是否到終點的判斷語句在迴圈中的位置

#include#include#include#include#include#includeusing namespace std;

const int max_r = 100;

const int max_c = 100;

typedef pairp;

void bfs()

; int dirc[4] = ;

//傳送門開始座標

int trar[max_r], trac[max_c];

//傳送門到達座標

int arriver[max_r], arrivec[max_c];

int n, m, num, flag, endflag = 0;

//出生點

int starr, starc;

//目的地

int endr, endc;

int aftermover, aftermovec;

cin >> n >> m;

for (int i = 0; i> map[i][j];

} }cin >> num;

for (int i = 0; i < num; ++i)

cin >> starr >> starc >> endr >> endc;

queueque;

//初始化步數

for (int i = 0; i < n; i++) }

if (starr == endr&&starc == endc)

else

return 0;

}}

description

有乙個n*m(n,m<=10)的格仔迷宮,1代表該格仔為牆,不能通過,0代表可以通過,人在迷宮中可以嘗試上下左右四個方向移動。

另外,在迷宮中如果從左邊走出迷宮會回到迷宮最右邊一格(只要該格不是牆),行不變,同樣,從右邊走出迷宮會

回到迷宮最左邊一格,向上走出迷宮會回到迷宮最下邊一格,向下走出迷宮會回到迷宮最上邊一格。

現在給定乙個迷宮,以及起點和終點,問最少多少步可以走出迷宮。如果不能走出迷宮輸出「die」。

輸入格式

該程式為多case,第1行為case的數量

每乙個case,第1行為兩個數n(行)和m(列)

然後n行每行m個數,之後是起點座標和終點座標sc(行) sr(列) ec(行) er(列)

輸出格式

如題輸入樣例

24 3

011010

110110

0 0 3 2

2 201

100 0 1 1

輸出樣例

4die

體會:改變一下map的結構

#include#include#include#include#include#includeusing namespace std;

const int max_r = 100;

const int max_c = 100;

typedef pairp;

void bfs()

; int dirc[4] = ;

int n, m, flag;

//出生點

int starr, starc;

//目的地

int endr, endc;

int aftermover, aftermovec;

cin >> n >> m;

for (int i = 0; i < max_r; ++i) }

for (int i = 1; i <= n; ++i) }

cin >> starr >> starc >> endr >> endc;

queueque;

starr++;

starc++;

endr++;

endc++;

//初始化步數

for (int i = 1; i <= n; i++) }

if (starr == endr&&starc == endc)

else

}if (i == 1 && map[aftermover][aftermovec] == '2'&&map[1][p.second] == '0'&&step[1][p.second] == 0)

}if (i == 2 && map[aftermover][aftermovec] == '2'&&map[p.first][m] == '0'&&step[p.first][m] == 0)

}if (i == 3 && map[aftermover][aftermovec] == '2'&&map[p.first][1] == '0'&&step[p.first][1] == 0)

}if (map[aftermover][aftermovec] == '0' && step[aftermover][aftermovec] == 0)}}

//判斷是否完整走完上個迴圈

if (i != 4)

}if (aftermover == endr&&aftermovec == endc)

else

}}int main()

getchar();

getchar();

return 0;

}

碾轉相除求最大公約數 最大公倍數

在數學中,輾轉相除法,又稱歐幾里得演算法,是求最大公約數的演算法。輾轉相除法首次出現於歐幾里得的 幾何原本 第vii卷,命題y 和 中,而在中國則可以追溯至東漢出現的 九章算數 兩個整數的最大公約數是能夠同時整除它們的最大的正整數。輾轉相除法基於如下原理 兩個整數的最大公約數等於其中較小的數和兩數的...

求最大公因數和最小公倍數

利用更相減損術與輾轉相除法來實現求最大公因數與最小公倍數的功能。如下 博主入門不久,還請神犇們多指教 include include using namespace std int number1,number2,number3,number4,answer void change 自定義函式,用於...

求最大公約數,最小公倍數演算法

一般常見的演算法有 求差判定法,歐幾里得演算法,stein演算法。這邊重點介紹歐幾里得演算法,就是常說的輾轉相除法,是經典的求解最大公約數的演算法。輾轉相除法求最大公約數 演算法的基本思想是 假設 a b,則餘數 r a b,若餘數 r 為 0,則 b 即為所求的數 若餘數 r不為 0,則互換 置a...