模拟水珠那个游戏。
小水珠超过边界会消失。
会有两个水珠同时到达一个size=4大水珠的情况。要移动完统一爆炸
1 #include <vector> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 //using namespace std; 7 8 const int maxn = 100+10; 9 int r,c,n,T; 10 11 int dx[] = {0,0,1,-1}; 12 int dy[] = {1,-1,0,0}; 13 14 struct dp 15 { 16 int x,y; 17 int dir; 18 bool die; 19 dp(int _x,int _y,int _dir):x(_x),y(_y),dir(_dir){ 20 die = false; 21 } 22 bool out() 23 { 24 return (x < 1 || x > r || y < 1 || y > c); 25 } 26 void kill() 27 { 28 die = true; 29 } 30 void move() 31 { 32 x += dx[dir]; 33 y += dy[dir]; 34 if(out()) 35 { 36 kill(); 37 return ; 38 } 39 } 40 bool alive() 41 { 42 return !die; 43 } 44 }; 45 std::vector <dp> drops; 46 47 struct wdp 48 { 49 int x,y; 50 int siz; 51 int t; 52 int id; 53 void display() 54 { 55 printf("%d %d\n",siz==-1? 0:1,siz==-1?t:siz); 56 } 57 void add(int tim) 58 { 59 if(siz == -1) return ; 60 siz += 1; 61 } 62 void split(int tim) 63 { 64 if(siz > 4) 65 { 66 siz = -1; 67 t = tim; 68 //printf("time:%d %d crack\n",tim,id); 69 for(int i=0;i<4;i++) 70 { 71 drops.push_back(dp(x,y,i)); 72 } 73 } 74 } 75 bool alive() 76 { 77 return siz != -1; 78 } 79 }waterdrop[maxn]; 80 81 bool merge(dp &a,wdp &b) 82 { 83 return (a.x == b.x && a.y == b.y); 84 } 85 86 void roll(int tim) 87 { 88 int cnt = drops.size(); 89 for(int i=0;i<cnt;i++) if(drops[i].alive()) 90 { 91 drops[i].move(); 92 if(!drops[i].alive()) continue; 93 //printf("drops: [%d,%d]\n",drops[i].x,drops[i].y); 94 for(int j=0;j<n;j++) if(waterdrop[j].alive()) 95 { 96 if(merge(drops[i],waterdrop[j])) 97 { 98 waterdrop[j].add(tim); 99 drops[i].kill(); 100 break ; 101 } 102 } 103 } 104 for(int i=0;i<n;i++) waterdrop[i].split(tim); 105 } 106 107 int main() 108 { 109 //freopen("input.txt","r",stdin); 110 while(~scanf("%d%d%d%d",&r,&c,&n,&T)) 111 { 112 int x,y,siz; 113 drops.clear(); 114 for(int i=0;i<n;i++) 115 { 116 scanf("%d%d%d",&x,&y,&siz); 117 waterdrop[i].x = x; 118 waterdrop[i].y = y; 119 waterdrop[i].siz = siz; 120 waterdrop[i].id = i+1; 121 } 122 scanf("%d%d",&x,&y); 123 for(int i=0;i<4;i++) 124 { 125 drops.push_back(dp(x,y,i)); 126 } 127 for(int i=1;i<=T;i++) 128 { 129 roll(i); 130 } 131 for(int i=0;i<n;i++) 132 { 133 waterdrop[i].display(); 134 } 135 } 136 }
想到了大一刚开始做的那个傻x坦克大战- -当时写一个判断子弹写半天
时间: 2024-10-16 21:40:39