19凡路国庆小作业的题解集合(qwq只是我出的题,我会标明出处的)
首先就是这些题的做法绝对不止一种,有些是可以百度到的那些做法可能会更好的解法,
这里是只提供一种思路罢了
10.1
git的使用
我的演示视频有在大群里面,那就算是题解吧
10.2
井字棋的实现思路
这里我丢一下我去年写的很丑的实现代码吧,可能存在bug(好像确实是有),然后我写的比较乱,你们可以码云上看陆震写的代码
他写的比较清楚,理解起来比较简单转移链接:点我转移
然后这边挂一下我的代码(刚学c++时写的qwq我还是太菜了)
1 #include<iostream> 2 #include<stdio.h> 3 #include<windows.h> 4 #include<stdlib.h> 5 using namespace std; 6 char ma[6][7]; 7 int k=0, win[10000]= {0}; 8 const char ch1='X'; 9 const char ch2='O'; 10 int play1(); 11 int play2(); 12 int judge(char ch); 13 void clean(); 14 void output(); 15 int main() 16 { 17 system("color b1"); 18 int n,flag; 19 printf(" ****************************\n"); 20 printf(" ** 1.玩家对战 **\n"); 21 printf(" ** 2.人机大战 **\n"); 22 printf(" ** 0.退出游戏 **\n"); 23 printf(" ****************************\n"); 24 printf(" 请输入你的选择:"); 25 cin>>n; 26 if(n==1) 27 { 28 while(1) 29 { 30 cout<<" ****** 开启人人对战模式 *****"<<endl; 31 int i=0; 32 play1(); 33 while(win[i]!=0) 34 { 35 if(win[i]==1) 36 cout<<"第"<<i+1<<"局,玩家一获胜。"<<endl; 37 else if(win[i]==2) 38 cout<<"第"<<i+1<<"局,玩家二获胜。"<<endl; 39 i++; 40 41 } 42 cout<<endl; 43 cout<<"请问您是否想要继续游戏?(是输入1,否输入0)"; 44 cin>>flag; 45 if(flag) continue; 46 else 47 { 48 return 0; 49 } 50 } 51 52 } 53 else if(n==2) 54 { 55 while(1) 56 { 57 cout<<" ***** 开启人机对战模式 *****"<<endl; 58 59 int i=0; 60 play2(); 61 while(win[i]!=0) 62 { 63 if(win[i]==1) 64 cout<<"第"<<i+1<<"局,玩家获胜。"<<endl; 65 else if(win[i]==2) 66 cout<<"第"<<i+1<<"局,电脑获胜。"<<endl; 67 i++; 68 69 } 70 cout<<endl; 71 cout<<"请问您是否想要继续游戏?(是输入1,否输入0)"; 72 cin>>flag; 73 if(flag) continue; 74 else 75 { 76 return 0; 77 } 78 } 79 } 80 else return 0; 81 return 0; 82 } 83 void clean() 84 { 85 for(int i=0; i<6; i++) 86 for(int j=0; j<7; j++) 87 { 88 if(j%2==0&&i%2==0) ma[i][j]='|'; 89 else if(j%2==1&&i%2==1) ma[i][j]='_'; 90 else ma[i][j]=' '; 91 } 92 } 93 void output() 94 { 95 for(int i=0; i<=6; i++) 96 { 97 for(int j=0; j<7; j++) 98 { 99 cout<<ma[i][j]<<" "; 100 } 101 cout<<endl; 102 } 103 } 104 int play1() 105 { 106 char X,Y; 107 int x,y; 108 clean(); 109 cout<<"当前棋盘情况为:"<<endl; 110 output(); 111 cout<<"玩家一的棋子为"<<'X'<<","<<"玩家二的棋子为"<<'O'<<"."<<endl; 112 for(int i=0; i<9; i++) 113 { 114 if(i%2==0||i==0) 115 { 116 cout<<"请玩家一号输入坐标(参考输入:2 1):"; 117 cin>>X>>Y; 118 if(X>'9'||X<'0'||Y>'9'||Y<'0') 119 { 120 cout<<"非法输入"<<endl; 121 --i; 122 continue; 123 } 124 x=X-'0'; 125 y=Y-'0'; 126 if(x==1) x=0; 127 else if(x==3) x=4; 128 if(y==2) y=3; 129 else if(y==3) y=5; 130 if((x!=2&&x!=0&&x!=4)||ma[x][y]!=' '||(y!=1&&y!=3&&y!=5)) 131 { 132 cout<<"输入位置已经有旗子或坐标输入有误,请重新输入"<<endl; 133 --i; 134 continue; 135 } 136 ma[x][y]='X'; 137 cout<<"当前棋盘情况为:"<<endl; 138 output(); 139 140 } 141 else if(i%2==1) 142 { 143 cout<<"请玩家二号输入坐标(参考输入:2 1):"; 144 cin>>X>>Y; 145 if(X>'9'||X<'0'||Y>'9'||Y<'0') 146 { 147 cout<<"非法输入"<<endl; 148 --i; 149 continue; 150 } 151 x=X-'0'; 152 y=Y-'0'; 153 if(x==1) x=0; 154 else if(x==3) x=4; 155 if(y==2) y=3; 156 else if(y==3) y=5; 157 if((x!=2&&x!=0&&x!=4)||ma[x][y]!=' '||(y!=1&&y!=3&&y!=5)) 158 { 159 cout<<"输入位置已经有旗子或坐标输入有误,请重新输入"<<endl; 160 --i; 161 continue; 162 } 163 ma[x][y]='O'; 164 cout<<"当前棋盘情况为:"<<endl; 165 output(); 166 } 167 if(judge(ch1)) 168 { 169 cout<<"玩家一获得胜利!!!!"<<endl; 170 output(); 171 win[k++]=1; 172 return 0; 173 } 174 if(judge(ch2)) 175 { 176 cout<<"玩家二获得胜利!!!!"<<endl; 177 output(); 178 win[k++]=2; 179 return 0; 180 } 181 if(i==9) 182 { 183 cout<<"平局!!!"<<endl; 184 output(); 185 return 0; 186 } 187 } 188 } 189 int judge(char ch) 190 { 191 for(int i=0; i<5; i++) 192 { 193 if(i%2==0) 194 { 195 if(ma[i][1]==ch&&ma[i][3]==ch&&ma[i][5]==ch) 196 return 1; 197 } 198 } 199 for(int i=0; i<5; i++) 200 { 201 if(i%2==1) 202 { 203 if(ma[0][i]==ch&&ma[2][i]==ch&&ma[4][i]==ch) 204 return 1; 205 } 206 } 207 if(ma[0][1]==ch&&ma[2][3]==ch&&ma[4][5]==ch) 208 return 1; 209 if(ma[4][1]==ch&&ma[2][3]==ch&&ma[0][5]==ch) 210 return 1; 211 return 0; 212 } 213 int play2() 214 { 215 char X,Y; 216 int x,y; 217 clean(); 218 cout<<"当前棋盘情况为:"<<endl; 219 output(); 220 cout<<"玩家的棋子为"<<'X'<<","<<"电脑的棋子为"<<'O'<<"."<<endl; 221 for(int i=0; i<9; i++) 222 { 223 if(i%2==0||i==0) 224 { 225 cout<<"请玩家输入坐标(参考输入:2 1):"; 226 cin>>X>>Y; 227 if(X>'9'||X<'0'||Y>'9'||Y<'0') 228 { 229 cout<<"非法输入"<<endl; 230 --i; 231 continue; 232 } 233 x=X-'0'; 234 y=Y-'0'; 235 if(x==1) x=0; 236 else if(x==3) x=4; 237 if(y==2) y=3; 238 else if(y==3) y=5; 239 if((x!=2&&x!=0&&x!=4)||ma[x][y]!=' '||(y!=1&&y!=3&&y!=5)) 240 { 241 cout<<"输入位置已经有旗子或坐标输入有误,请重新输入"<<endl; 242 --i; 243 continue; 244 } 245 ma[x][y]='X'; 246 cout<<"当前棋盘情况为:"<<endl; 247 output(); 248 249 } 250 else 251 { 252 x=rand()%3+1; 253 y=rand()%3+1; 254 if(x==1) x=0; 255 else if(x==3) x=4; 256 if(y==2) x=3; 257 else if(y==3) x=5; 258 if((x!=2&&x!=0&&x!=4)||ma[x][y]!=' '||(y!=1&&y!=3&&y!=5)) 259 { 260 --i; 261 continue; 262 } 263 ma[x][y]='O'; 264 cout<<"当前棋盘情况为:"<<endl; 265 output(); 266 } 267 if(judge(ch1)) 268 { 269 cout<<"玩家一获得胜利!!!!"<<endl; 270 win[k++]=1; 271 return 0; 272 } 273 if(judge(ch2)) 274 { 275 cout<<"电脑获得胜利!!!!"<<endl; 276 output(); 277 win[k++]=2; 278 return 0; 279 } 280 if(i==9) 281 { 282 cout<<"平局!!!"<<endl; 283 output(); 284 return 0; 285 } 286 } 287 }
10.4
拉普兰德
这个题是一个数学题,可以百度一下巴什博奕。
然后只要石头总数是m+1的倍数就代表着,每次先手拿x个,后手都可以拿m+1-x个,就凑成了m+1的,
所以当为m+1的倍数个石头时后手稳赢,
建议你们对数学感兴趣的可以去了解一下,巴什博奕还可以拓展很多题目:转移链接
10.6
6和9
这个题目是根据一个比赛的题改编的,做法基本一样,这边丢一下原题链接,你们甚至可以交一发:题目链接
因为是国外网站可能比较卡。
思路:
一共有三种情况:
- 字符串长度等于n,这时候直接输出字符串就行了
- 字符串长度小于n,这时候要想办法增加字符,因为9可以增加任意数目的字符,所以只要有一个雪花就可以使字符串的长度达到n。如果没有9,则输出Impossible。
- 字符串长度大于n,这时候要想办法删出字符,6和9都可以删除字符,所以我们只需要记下6和9的总数,然后与要删除的数目比较,如果大于等于则可以删减到n,如果小于则输出Impossible。
原来忘记说了 6或9的前面必定是字符,所以不用考虑6和9连载一起的情况
下面丢一下我去年写的代码吧,比较莽不是很好看(把*和?改成6和9就行)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,len,sum=0,sum1=0,sum2=0;///分别记录字母的数量,?的数量,*的数量 6 char a[201]; 7 gets(a); 8 cin>>n; 9 len=strlen(a); 10 for(int i=0; i<len; i++) 11 if(a[i]>='a'&&a[i]<='z') 12 sum++; 13 else if(a[i]=='?') 14 sum1++; 15 else if(a[i]=='*') 16 sum2++; 17 if(sum==n)///如果字母的数量等于n直接输出字符串(跳过*,?) 18 { 19 for(int i=0; i<len; i++) 20 if(a[i]>='a'&&a[i]<='z') 21 cout<<a[i]; 22 } 23 else if(sum>n)///如果预期的少于已经有的,则需要减少字符 24 { 25 int ch=sum-n;///判断要减少的个数 26 if(ch>(sum1+sum2))///如果?和*的数量加起来都少于要减少的则就不可能存在,输出impossible 27 cout<<"Impossible"; 28 else///反之,消掉ch个字符 29 { 30 for(int i=0; i<len; i++) 31 { 32 if((a[i+1]=='?'||a[i+1]=='*')&&ch)///消去前ch个非字母字符前的字母 33 { 34 i++;///还要跳过?* 35 --ch; 36 } 37 else if((a[i]=='?'||a[i]=='*')&&ch==0) 38 continue; 39 else cout<<a[i]; 40 } 41 } 42 } 43 else if(sum<n)///如果n>已经有的字母,就需要增加字母 44 { 45 if(sum2==0)///*是唯一能增加字母的,如果雪花为0个就不能让字母增加所以输出impossible 46 cout<<"Impossible"; 47 else///对于第一个*,输出需要增加的个数的第一个*前的字母 48 { 49 int flag=0; 50 for(int i=0; i<len; i++) 51 { 52 if(a[i]=='?'||a[i]=='*') 53 continue; 54 else if(a[i+1]=='*'&&flag==0) 55 { 56 cout<<a[i]; 57 for(int j=1; j<=n-sum; j++) 58 cout<<a[i]; 59 i++; 60 flag=1; 61 } 62 else cout<<a[i]; 63 } 64 } 65 } 66 67 return 0; 68 }
ok,到这里题解结束,希望大家努力学习呀,加快进度,争取都能进凡路呀!