題目
前短時(shí)間耍共,同學(xué)給看了一道诡蜓,某個(gè)歷年的考研機(jī)試題熬甫。我想用面向?qū)ο蟮姆椒ㄈ?shí)現(xiàn)。
一個(gè)m*n的棋盤(pán)蔓罚,上面有k根蔥罗珍,每根蔥面朝方向?yàn)閐(0123分別表示上下左右),每根蔥一個(gè)戰(zhàn)斗力f脚粟。每隔時(shí)間蔥會(huì)向面朝方向走一格, 如果遇到棋盤(pán)邊界蘸朋,那么他將把面朝方向轉(zhuǎn)180度(此回合蔥不會(huì)走動(dòng))核无,如果某個(gè)時(shí)刻有兩個(gè)或以上的蔥在同一位置,那么他們將發(fā)生 戰(zhàn)爭(zhēng)藕坯,只有戰(zhàn)斗力最高的蔥存活团南,其他的蔥全部原地枯萎,不在走動(dòng)炼彪,求經(jīng)過(guò)t時(shí)間后所有蔥的位置吐根。
<!--move-->輸入:第一行m n k辐马,然后接下來(lái)k行每根蔥的信息x y d f(坐標(biāo)拷橘,方向,戰(zhàn)斗力)喜爷,最后一行輸入時(shí)間t冗疮。
輸出:k行,分別表示每個(gè)蔥的位置檩帐。
數(shù)據(jù)范圍:m和n在100內(nèi)术幔,k在1000內(nèi),t在1000內(nèi)湃密,f在1000內(nèi)诅挑,保證初始每顆蔥位置不同四敞,戰(zhàn)斗力不同。
Java面向?qū)ο髮?xiě)法
1拔妥,建一個(gè)Cong(蔥)類(lèi)忿危。
(1)數(shù)據(jù)成員:x 橫坐標(biāo),y 縱坐標(biāo)毒嫡,d 方向癌蚁,f 戰(zhàn)斗力,isLive 是否存活(默認(rèn)存活)兜畸。
private int x;
private int y;
private int d;
private int f;
private boolean isLive = true;
(2)主要成員方法:
走:
public void go() {// 走
if (!isLive)
return;
switch (d) {
case 0:
y++;
break;
case 1:
y--;
break;
case 2:
x--;
break;
case 3:
x++;
break;
}
}
轉(zhuǎn)向:
public void turn() {// 轉(zhuǎn)向
if (!this.isLive)
return;
switch (d) {
case 0:
d = 1;
break;
case 1:
d = 0;
break;
case 2:
d = 3;
break;
case 3:
d = 2;
break;
}
}
打架:
public void fight(Cong c) {// 打架
if (!this.isLive || !c.isLive())// 死了沒(méi)努释?
return;
if (this.x == c.getX() && this.y == c.getY()) {// 遇見(jiàn)沒(méi)?
if (this.f > c.getF()) {
c.setLive(false);
} else if (this.f < c.getF()) {
this.setLive(false);
} else {
this.setLive(false);
c.setLive(false);
}
}
}
2咬摇,Pan(棋盤(pán))類(lèi)
(1)數(shù)據(jù)成員:m 寬度伐蒂,n 高度,g 蔥的集合肛鹏。
private int m;
private int n;
private List<Cong> g;
(2)主要方法:
public void run() {
for (Cong c : g) {
if (!c.isLive())// 死亡
continue;
war(c);// 戰(zhàn)爭(zhēng)
if (isTurn(c)) {// 行動(dòng)
c.turn();
} else {
c.go();
}
}
}
public boolean isTurn(Cong c) {// 是否轉(zhuǎn)向
if (c.getX() == 0 && c.getD() == 2)
return true;
if (c.getX() == m - 1 && c.getD() == 4)
return true;
if (c.getY() == 0 && c.getD() == 1)
return true;
if (c.getX() == n - 1 && c.getD() == 0)
return true;
return false;
}
public void war(Cong c) {
for (Cong c1 : g) {
if (c != c1)// 不跟自己打
c.fight(c1);
}
}
3逸邦,客戶端代碼
public class Client {// 客戶端
public static void main(String[] args) {
// 輸入
Scanner can = new Scanner(System.in);
int m = can.nextInt();
int n = can.nextInt();
int k = can.nextInt();
List<Cong> g = new ArrayList<Cong>();
for (int i = 0; i < k; i++) {
int x = can.nextInt();
int y = can.nextInt();
int d = can.nextInt();
int f = can.nextInt();
Cong c = new Cong(x, y, d, f);
g.add(c);
}
int t = can.nextInt();
can.close();
// 邏輯操作
Pan p = new Pan(m, n, g);
for (int i = 0; i < t; i++) {// 執(zhí)行t次
p.run();
}
// 輸出
for (int i = 0; i < k; i++) {
Cong c = g.get(i);
System.out.print(c.getX() + " " + c.getY() + "\n");
}
}
}