孵化器 软件第四周
Posted liumengyue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了孵化器 软件第四周相关的知识,希望对你有一定的参考价值。
1.设计一个老鼠走迷宫的程序,设定一个起点和一个终点,要求打印出所有的路线。 图的起点为(1,1),终点为(5,5)。
1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 5 int xx[5] = {1,-1,0,0}; 6 int yy[5] = {0,0,1,-1}; 7 int vis[12][12]; 8 int barrier[12][12]; 9 int x1, y3, x2, y2, cnt = 0,FLAG = 0; 10 11 void Create(void); 12 void dfs(int,int); 13 void Print(void); 14 15 int main() 16 { 17 Create(); 18 printf("输入起点和终点: "); 19 scanf("%d%d%d%d",&x1, &y3, &x2, &y2); 20 dfs(x1,y3); 21 if (FLAG == 0) 22 printf("无可达路径"); 23 return 0; 24 } 25 26 //作用:生成9X9的迷宫 27 //入口参数:无 28 //返回:无 29 30 void Create(void) 31 { 32 int i, j; 33 srand((unsigned int)time(0)); 34 printf("┏━━━━━━━━━━━━━━━━━━┓ "); 35 for (i = 1; i <= 9; i++) 36 { 37 printf("┃"); 38 for(j = 1; j <= 9; j++) 39 if (rand()%2 == 0) 40 { 41 barrier[i][j] = 1; 42 //printf("XX"); 43 printf("██"); 44 } 45 else 46 printf(" "); 47 printf("┃ "); 48 } 49 printf("┗━━━━━━━━━━━━━━━━━━┛ "); 50 } 51 52 //作用:搜索路线 53 //入口参数:起点 54 //返回:无 55 56 void dfs(int x,int y) 57 { 58 int i; 59 vis[x][y] = ++cnt; 60 if (x == x2 && y == y2) 61 { 62 FLAG = 1; 63 Print(); 64 vis[x][y] = 0; 65 cnt --; 66 return ; 67 } 68 for (i = 0; i < 4; i++) 69 if (x+xx[i] > 0 && x+xx[i] <=9 && y+yy[i] > 0 && y+yy[i] <= 9) 70 if (vis[x+xx[i]][y+yy[i]] == 0 && barrier[x+xx[i]][y+yy[i]] == 0) 71 { 72 dfs(x+xx[i],y+yy[i]); 73 } 74 vis[x][y] = 0; 75 cnt --; 76 } 77 78 //作用:输出可行路线 79 //入口参数:无 80 //返回:无 81 82 void Print(void) 83 { 84 int i, j; 85 printf("┏━━━━━━━━━━━━━━━━━━┓ "); 86 for (i = 1; i <= 9; i++) 87 { 88 printf("┃"); 89 for (j = 1; j <= 9; j++) 90 { 91 if (barrier[i][j]) 92 printf("██"); 93 else 94 if (vis[i][j]) 95 printf("%2d",vis[i][j]); 96 else 97 printf(" "); 98 } 99 printf("┃ "); 100 } 101 printf("┗━━━━━━━━━━━━━━━━━━┛ "); 102 }
2.编写万年历
(1)输入某一年的某个月份(如输入“2018.9”),输出当月的日期和星期对照表
(2)查询某年某月某日(如输入“2018.9.1”),输出该日期是星期几
(3)日期与星期对照表格式整齐,简单易懂
(4)附加:查询某年某月某日,出现农历日期。/可输出某一年的完整日历
提示:(1)已知 1900 年 1 月 1 日是星期一(2)闰年判定条件是:四年一闰、百年不 闰、四百年再闰。
1 #include <stdio.h> 2 3 int b[15] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; 4 int y,m,d; 5 6 int Find(int, int, int); 7 int Leapyear(int); 8 void Print(int); 9 10 int main() 11 { 12 printf("打印日历,输入某年某个月份: "); 13 scanf("%d%d", &y, &m); 14 Print(Find(y,m,1)); 15 printf(" 查询某年某月某日是星期几,输入年,月,日: "); 16 scanf("%d%d%d",&y,&m,&d); 17 printf("%d",Find(y,m,d)); 18 return 0; 19 } 20 21 //作用:查找y年m月d日是星期几 22 //入口参数:年月日 23 //返回:这天是星期几 24 25 int Find(int y,int m,int d) 26 { 27 int x = 0, i; 28 for (i = 1900; i < y; i++) 29 { 30 x += 365; 31 if (Leapyear(i)) 32 x++; 33 } 34 for (i = 1; i < m; i ++) 35 x += b[i]; 36 x += d-1; 37 if (Leapyear(y)) 38 { 39 if (m > 2) 40 x++; 41 if (m == 2 && d == 29) 42 x ++; 43 } 44 return x%7+1; 45 } 46 47 //作用:判断闰年 48 //入口参数:年份 49 //返回:1或0,代表该年是否为闰年 50 int Leapyear(int y) 51 { 52 if ((y%400 == 0) || ((y%4 == 0) && (y%100) != 0)) 53 return 1; 54 return 0; 55 } 56 57 //作用:打印某年某月日历 58 //入口参数:这个月第一天是星期几 59 //返回:无 60 61 void Print(z) 62 { 63 int i,t = z; 64 printf("***********2018 9*********** "); 65 printf("***************************** "); 66 printf(" Sun Mon Tur Wen Thu Fri Sat "); 67 if (z != 7) 68 for (i = 1; i <= z; i++) 69 printf(" "); 70 for (i = 1; i <= b[m]; i++) 71 { 72 printf("%4d",i); 73 t++; 74 if (t%7 == 0) 75 printf(" "); 76 } 77 }
3.小范学长很喜欢玩 2048 这个游戏,于是,小范学长有天想能不能自己也用 C 语言写一个 2048 的游戏,可是小范学长最近比较忙,没有时间去写相应的游戏代码,所以聪明的萌新 们能帮助小范学长实现他的愿望么?
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 int a[6][6]; 6 int FLAG = 0; 7 8 void Create(void); 9 void Print(void); 10 void comb(int, int, int, int); 11 int Move(char); 12 int Lmove(int); 13 int Rmove(int); 14 int Umove(int); 15 int Dmove(int); 16 int Check(void); 17 18 int main() 19 { 20 a[0][0] = a[0][1] = a[0][2] = a[0][3] = a[0][4] = a[0][5] = 1; 21 a[5][0] = a[5][1] = a[5][2] = a[5][3] = a[5][4] = a[5][5] = 1; 22 a[1][0] = a[2][0] = a[3][0] = a[4][0] = 1; 23 a[1][5] = a[2][5] = a[3][5] = a[4][5] = 1; 24 25 char direction; 26 Create(); 27 Print(); 28 while (1) 29 { 30 scanf("%c", &direction); 31 getchar(); 32 if(Move(direction)) 33 { 34 if (FLAG == 1) 35 { 36 printf("WIN"); 37 break; 38 } 39 Create(); 40 //system("cls"); 41 Print(); 42 } 43 else 44 if (Check() == 1) 45 printf("LOSE"); 46 } 47 return 0; 48 } 49 50 //作用:随机在矩阵空余处生成2或4 51 //入口参数:无 52 //返回:0代表创建成功,1代表创建失败。 53 void Create(void) 54 { 55 int i, j, flag = 0; 56 srand((unsigned)time(0)); 57 while (1) 58 { 59 if (flag == 1) 60 break; 61 i = rand()%4 + 1; 62 j = rand()%4 + 1; 63 if (a[i][j] == 0) 64 { 65 if (rand()%2 == 0) 66 a[i][j] = 2; 67 else 68 a[i][j] = 4; 69 flag = 1; 70 } 71 } 72 } 73 //作用:打印矩阵 74 //入口参数:无 75 //返回:无 76 void Print(void) 77 { 78 int i, j; 79 //system("cls"); 80 printf("┏━━━━┳━━━━┳━━━━┳━━━━┓ "); 81 for (i = 1; i <= 4; i++) 82 { 83 for (j = 1; j <= 4; j++) 84 { 85 if (a[i][j] != 0) 86 printf("│%4d",a[i][j]); 87 else 88 printf("│ "); 89 } 90 if (i != 4) 91 printf("│ ┣━━━━╋━━━━╋━━━━╋━━━━┫ "); 92 } 93 printf("│ ┗━━━━┻━━━━┻━━━━┻━━━━┛ "); 94 } 95 96 //作用:四方向合并移动 97 //入口参数:移动方向 98 //返回:是否能够合并,0代表无法合并,1代表可以合并 99 100 int Move(char c) 101 { 102 if (c == ‘a‘) 103 return (Lmove(1)+Lmove(2)+Lmove(3)+Lmove(4)); 104 if (c == ‘d‘) 105 return (Rmove(1)+Rmove(2)+Rmove(3)+Rmove(4)); 106 if (c == ‘w‘) 107 return (Umove(1)+Umove(2)+Umove(3)+Umove(4)); 108 if (c == ‘s‘) 109 return (Dmove(1)+Dmove(2)+Dmove(3)+Dmove(4)); 110 return 0; 111 } 112 113 //作用:左合并 左移第i行 114 //入口参数:变量i 115 //返回:是否能够合并,0代表无法合并,1代表可以合并 116 117 int Lmove(int i) 118 { 119 120 int cnt = 0,j,flag = 0; 121 //左移第i行 122 for (j = 1; j <= 4; j++) 123 if (a[i][j] != 0) 124 { 125 if (a[i][j-1] == 0) 126 flag = 1; 127 a[i][++cnt] = a[i][j]; 128 if (cnt != j) 129 a[i][j] = 0; 130 } 131 //左合并第i行 132 if (a[i][1] == a[i][2] &&a[i][1] != 0) 133 { 134 comb(i,1,i,2); flag = 1; 135 } 136 if (a[i][2] == a[i][3] && a[i][2] != 0) 137 { 138 comb(i,2,i,3); flag = 1; 139 } 140 if (a[i][3] == a[i][4] && a[i][3] != 0) 141 { 142 comb(i,3,i,4); flag = 1; 143 } 144 cnt = 0; 145 //左移第i行 146 for (j = 1; j <= 4; j++) 147 if (a[i][j] != 0) 148 { 149 a[i][++cnt] = a[i][j]; 150 if (cnt != j) 151 a[i][j] = 0; 152 } 153 return flag; 154 } 155 156 157 //作用:右合并 右移第i行 158 //入口参数:变量i 159 //返回:是否能够合并,0代表无法合并,1代表可以合并 160 161 int Rmove(int i) 162 { 163 164 int cnt = 5,j, flag = 0; 165 //右移第i行 166 for (j = 4; j >= 1; j--) 167 if (a[i][j] != 0) 168 { 169 if (a[i][j+1] == 0) 170 flag = 1; 171 a[i][--cnt] = a[i][j]; 172 if (cnt != j) 173 a[i][j] = 0; 174 } 175 //右合并第i行 176 if (a[i][4] == a[i][3] && a[i][4] != 0) 177 { 178 comb(i,4,i,3); flag = 1; 179 } 180 if (a[i][3] == a[i][2] && a[i][3] != 0) 181 { 182 comb(i,3,i,2); flag = 1; 183 } 184 if (a[i][2] == a[i][1] && a[i][2] != 0) 185 { 186 comb(i,2,i,1); flag = 1; 187 } 188 cnt = 5; 189 //右移第i行 190 for (j = 4; j >= 1; j--) 191 if (a[i][j] != 0) 192 { 193 a[i][--cnt] = a[i][j]; 194 if (cnt != j) 195 a[i][j] = 0; 196 } 197 return flag; 198 } 199 200 201 202 //作用:上合并 上移第j列 203 //入口参数:变量j 204 //返回:是否能够合并,0代表无法合并,1代表可以合并 205 206 int Umove(int j) 207 { 208 209 int cnt = 0, i, flag = 0; 210 //上移第j列 211 for (i = 1; i <= 4; i++) 212 if (a[i][j] != 0) 213 { 214 if (a[i-1][j] == 0) 215 flag = 1; 216 a[++cnt][j] = a[i][j]; 217 if (cnt != i) 218 a[i][j] = 0; 219 } 220 //上合并第j列 221 if (a[1][j] == a[2][j] && a[1][j] != 0) 222 { 223 comb(1,j,2,j); flag = 1; 224 } 225 if (a[2][j] == a[3][j] && a[2][j] != 0) 226 { 227 comb(2,j,3,j); flag = 1; 228 } 229 if (a[3][j] == a[4][j] && a[3][j] != 0) 230 { 231 comb(3,j,4,j); flag = 1; 232 } 233 cnt = 0; 234 //上移第j列 235 for (i = 1; i <= 4; i++) 236 if (a[i][j] != 0) 237 { 238 a[++cnt][j] = a[i][j]; 239 if (cnt != i) 240 a[i][j] = 0; 241 } 242 return flag; 243 } 244 245 246 247 248 249 //作用:下合并 下移第j列 250 //入口参数:变量j 251 //返回:是否能够合并,0代表无法合并,1代表可以合并 252 253 int Dmove(int j) 254 { 255 256 int cnt = 5, i, flag = 0; 257 //下移第j列 258 for (i = 4; i >= 1; i--) 259 if (a[i][j] != 0) 260 { 261 if (a[i+1][j] == 0) 262 flag = 1; 263 a[--cnt][j] = a[i][j]; 264 if (cnt != i) 265 a[i][j] = 0; 266 } 267 //下合并第j列 268 if (a[4][j] == a[3][j] && a[4][j] != 0) 269 { 270 comb(4,j,3,j); 271 flag = 1; 272 } 273 if (a[3][j] == a[2][j] && a[3][j] != 0) 274 { 275 comb(3,j,2,j); 276 flag = 1; 277 } 278 if (a[2][j] == a[1][j] && a[2][j] != 0) 279 { 280 comb(2,j,1,j); 281 flag = 1; 282 } 283 cnt = 5; 284 //下移第j列 285 for (i = 4; i >= 1; i--) 286 if (a[i][j] != 0) 287 { 288 a[--cnt][j] = a[i][j]; 289 if (cnt != i) 290 a[i][j] = 0; 291 } 292 return flag; 293 } 294 295 296 //作用:将(x2,y2)处元素合并到(x1,y1)上 297 //入口参数:坐标(x1,y1) (x2,y2) 298 //返回:无 299 300 void comb(int x1, int y1, int x2, int y2) 301 { 302 a[x1][y1] *= 2; 303 a[x2][y2] = 0; 304 if (a[x1][y1] == 2048) 305 FLAG = 1; 306 } 307 308 //作用:检查矩阵是否填满 309 //入口参数:无 310 //返回:1代表矩阵已满,0代表矩阵未满 311 312 int Check() 313 { 314 int i, j, cnt = 0; 315 for (i = 1; i <= 4; i++) 316 for (j = 1; j <= 4; j++) 317 if (a[i][j] != 0) 318 cnt ++; 319 if (cnt == 16) 320 return 1; 321 else 322 return 0; 323 }
4.前段时间“最强大脑”大热,尤其是那个数字华容道的题目让小范学长看的那叫一个热血 沸腾(这可能是小范学长唯一能看懂的题目),于是小范学长想能不能用 C 语言自己也做一 个,可是大家懂的,小范学长连上一个 2048 也没时间写,所以数字华容道当然也就没时间 了,所以大家能不能再帮帮贪玩的小范学长,让他能两个游戏换着玩?
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 int n, x, y; 6 char direction; 7 int a[10][10]; 8 9 void Create(int); 10 void Print(void); 11 void Move(char); 12 void Check(void); 13 14 int main() 15 { 16 printf("输入n生成n阶华容道: 使用wsad移动 "); 17 scanf("%d",&n); 18 Create(n); 19 Print(); 20 while (1) 21 { 22 getchar(); 23 scanf("%c",&direction); 24 Move(direction); 25 Print(); 26 Check(); 27 } 28 return 0; 29 } 30 31 //作用:生成华容道 32 //入口参数:华容道阶数 33 //返回:无 34 35 void Create(int n) 36 { 37 int i, j; 38 for (i = 1; i <= n; i++) 39 for (j = 1; j <= n; j++) 40 a[i][j] = (i-1)*n + j; 41 a[n][n] = 0; 42 x = y = n; 43 44 srand((unsigned)time(0)); 45 i = rand()%n + 1; 46 j = (i+100)%n +1; 47 a[n][n] = a[i][j]; 48 a[i][j] = 0; 49 x = i; 50 y = j; 51 } 52 53 //作用:打印华容道 54 //入口参数:无 55 //返回:无 56 57 void Print(void) 58 { 59 int i, j; 60 for (i = 1; i <= n; i++) 61 { 62 for (j = 1; j <= n; j++) 63 { 64 if (a[i][j] != 0) 65 printf("%4d",a[i][j]); 66 else 67 printf(" "); 68 } 69 printf(" "); 70 } 71 } 72 73 //作用:完成数字移动 74 //入口参数:方向 75 //返回:无 76 77 void Move(char d) 78 { 79 if (d == ‘w‘) 80 if (x+1 <= n) 81 { 82 a[x][y] = a[x+1][y]; 83 a[x+1][y] = 0; 84 x++; 85 } 86 if (d == ‘s‘) 87 if (x-1 >= 1) 88 { 89 a[x][y] = a[x-1][y]; 90 a[x-1][y] = 0; 91 x--; 92 } 93 if (d == ‘a‘) 94 if (y+1 <= n) 95 { 96 a[x][y] = a[x][y+1]; 97 a[x][y+1] = 0; 98 y++; 99 } 100 101 if (d == ‘d‘) 102 if (y-1 >= 1) 103 { 104 a[x][y] = a[x][y-1]; 105 a[x][y-1] = 0; 106 y--; 107 } 108 } 109 110 //作用:检查是否完成 111 //入口参数:无 112 //返回:无 113 114 void Check(void) 115 { 116 int i, j, flag = 0; 117 if (a[n][n] == 0 && a[n][n-1] == n*n-1) 118 { 119 flag = 1; 120 for (i = 1; i < n; i++) 121 { 122 if (flag == 0) 123 break; 124 for (j = 1; j < n; j++) 125 if (a[i][j] != (i-1)*n + j) 126 { 127 flag = 0; 128 break; 129 } 130 } 131 } 132 if (flag == 1) 133 printf("WIN"); 134 }
以上是关于孵化器 软件第四周的主要内容,如果未能解决你的问题,请参考以下文章