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 }
View Code

10.4

   拉普兰德

   这个题是一个数学题,可以百度一下巴什博奕。

  然后只要石头总数是m+1的倍数就代表着,每次先手拿x个,后手都可以拿m+1-x个,就凑成了m+1的,

 所以当为m+1的倍数个石头时后手稳赢,

建议你们对数学感兴趣的可以去了解一下,巴什博奕还可以拓展很多题目:转移链接

10.6

 6和9

这个题目是根据一个比赛的题改编的,做法基本一样,这边丢一下原题链接,你们甚至可以交一发:题目链接

因为是国外网站可能比较卡。

思路:

一共有三种情况:

  1. 字符串长度等于n,这时候直接输出字符串就行了
  2. 字符串长度小于n,这时候要想办法增加字符,因为9可以增加任意数目的字符,所以只要有一个雪花就可以使字符串的长度达到n。如果没有9,则输出Impossible。
  3. 字符串长度大于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 }
View Code

 

  ok,到这里题解结束,希望大家努力学习呀,加快进度,争取都能进凡路呀!

 

posted @ 2019-10-13 21:16  悲离  阅读(198)  评论(0编辑  收藏  举报