疫情期間,一定要避免人群聚集,某同學打算使用計算機程式來模
擬:長 100 米的跑道上有 m 個人。有的面朝左,有的面朝右。 每個
人都只能沿著跑道走,速度是 1m/秒。 當兩個人碰面時,他們會同時
掉頭往相反的方向走。 這些人中,有 1 個人感染了新型冠狀病毒。
并且在和其它人碰面時,會把冠狀病毒傳染給碰到的人。 請你計算,
當所有人都離開跑道時,有多少人感染了新型冠狀病毒。
uj5u.com熱心網友回復:
這道題簡單寫了個程式測了一下,還要跟每個人的初始位置和朝向有關。測驗代碼是用隨機來設定這些位置和朝向的,所以每次結果不一樣,也就說題目的條件不夠,有多少人感染不是確定值
#define MAX_LEN 100
class Runner {
private:
int ill = 0;
int dir = 1;
int pos = 0;
public:
Runner(int pos, int dir) {this->pos = pos; this->dir = dir;}
~Runner(){}
void changeDir() {dir *= -1;}
void setIll() {ill=1;}
void run() {pos += dir;}
int getDir() {return dir;}
int getPos() {return pos;}
int isIll() {return ill;}
int isOut() {return (pos<=0 || pos>= MAX_LEN) ? 1 : 0;}
};
int main(int argc, const char * argv[]) {
int m = 5;
//scanf("%d", &m);
srand((unsigned int)time(NULL)); //取亂數
Runner **runner = new Runner *[m];
int dirs[2] = {1, -1};
int ill = rand()%m; //隨機一個有病
for (int i=0; i<m; i++) {
int pos = rand()% MAX_LEN; //隨機位置
int dir = dirs[rand()%2]; //隨機方向
runner[i] = new Runner(pos, dir);
if (i==ill) runner[i]->setIll();
}
int out = 0;
while (out < m) { //還有沒離開跑道的就一直回圈
for (int i=0; i<m; i++) {//遍歷跑道中的兩個人,第i個人
if (runner[i]->isOut()) {
out++;
continue;
}
for (int j=0; j<m; j++) { //和第j個人
if (i==j || runner[j]->isOut()) continue;
if (runner[j]->getPos() == runner[i]->getPos()) { //如果他們位置相同,
if (runner[j]->isIll() || runner[i]->isIll()) {//且有一方感染
runner[j]->setIll(); //則雙方都感染
runner[i]->setIll();
}
if (runner[j]->getDir() != runner[i]->getDir()) {//如果雙方方向不同,
runner[j]->changeDir(); //則互相改變方向
runner[i]->changeDir();
}
}
}
}
for (int i=0; i<m; i++)
if (!runner[i]->isOut())
runner[i]->run(); //如果沒離開跑道就繼續跑
}
ill = 0;
for (int i=0; i<m; i++)
ill += runner[i]->isIll(); //統計感染人數
printf("all ills is %d\n", ill);
for (int i=0; i<m; i++) //釋放記憶體
delete runner[i];
delete[] runner;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123399.html
標籤:C++ 語言
