1.跳一跳
#include<iostream>
using namespace std;
int main(){
int n;
int ans=0,sc=1;
while(cin>>n){
if(n==1){
sc=1;
}
if(n==2){
if(sc==1) sc=2;
else sc+=2;
}
if(n==0) break;
ans+=sc;
}
cout<<ans<<endl;
}
2.碰撞的小球
#include<iostream>
#define L 1010
struct node{
int p,v;
};
node a[L];
int vis[L];
int n,t,l;
using namespace std;
int main(){
cin>>n>>l>>t;
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
a[i].p=tmp;
a[i].v=1;
vis[tmp]=1;
}
while(t--){
for(int i=0;i<n;i++){
if(a[i].p<=0||a[i].p>=l){
a[i].v=-a[i].v;
}
if(vis[a[i].p]==2){
a[i].v=-a[i].v;
}
}
for(int i=0;i<n;i++)
{
vis[a[i].p]--;
a[i].p+=a[i].v;
vis[a[i].p]++;
}
// for(int i=0;i<n;i++)
// cout<<a[i].p<<" "<<a[i].v<<" ";
// cout<<endl;
}
for(int i=0;i<n;i++)
cout<<a[i].p<<" ";
}
3.URL映射
很麻烦的模拟题,不想再写了,目前只有90分
#include<iostream>
#include<cstring>
#include<vector>
#include<string>
using namespace std;
bool is_num(const string &s){
if(!s.length()) return false;
for(int i=0;i<s.length();i++)
if(s[i]<'0'||s[i]>'9') return false;
return true;
}
struct node{
int typ; //0无, 1数字, 2字符串, 3路径
string data;
};
string solve(string s){
string ans="";
int i=0;
if(s[0]=='-') i++,ans+="-";
while(i<s.length()&&s[i]=='0') i++;
if(i==s.length()) ans+="0";
ans+=s.substr(i);
return ans;
}
struct url{
vector<node> v;
string data;
int has;
url(const string &s,const string &d){
data=d;
if(s[s.length()-1]=='/') has=1;
else has=0;
for(int i=0;i<s.length();){
int j=i+1;
string sub;
while(j<s.length()&&s[j]!='/') j++;
sub=s.substr(i+1,j-i-1);
if(sub=="<int>"){
v.push_back((node){1,""});
}else if(sub=="<str>"){
v.push_back((node){2,""});
}else if(sub=="<path>"){
v.push_back((node){3,""});
}else v.push_back((node){0,sub});
i=j;
}
}
bool cmp(const string &s){
int vp=0;
vector<string> ans;
for(int i=0;i<s.length();){
int j=i+1;
string sub;
if(vp>=v.size()) return false;
if(v[vp].typ==0){
while(j<s.length()&&s[j]!='/') j++;
sub=s.substr(i+1,j-i-1);
if(v[vp].data!=sub)
return false;
}else if(v[vp].typ==1){
while(j<s.length()&&s[j]!='/') j++;
sub=s.substr(i+1,j-i-1);
if(!is_num(sub))
return false;
ans.push_back(solve(sub));
}else if(v[vp].typ==2){
while(j<s.length()&&s[j]!='/') j++;
sub=s.substr(i+1,j-i-1);
ans.push_back(sub);
}else{
sub=s.substr(i+1);
ans.push_back(sub);
j=s.length();
}
vp++;
i=j;
}
// cout<<vp<<v.size()<<endl;
if(vp!=v.size()) return false;
cout<<data<<" ";
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
cout<<endl;
return true;
}
};
using namespace std;
vector<url> urls;
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
string a,b;
cin>>a>>b;
urls.push_back(url(a,b));
}
while(m--){
string a;
cin>>a;
int flag=1;
for(int i=0;i<n;i++){
if(urls[i].cmp(a)) {flag=0;break;}
}
if(flag)
cout<<"404"<<endl;
}
}
重新写了一份:
注意47行的细节:
可以用来判断行末的/号,肥肠好用!
#include<iostream>
#include<vector>
using namespace std;
vector<string> path,data;
bool is_num(const string &s){
for(int i=0;i<s.length();i++)
if(s[i]>'9'||s[i]<'0') return false;
return true;
}
string get_num(const string &s){
int i=0;
while(i<s.length()&&s[i]=='0') i++;
string sub=s.substr(i);
if(sub=="") sub="0";
return sub;
}
int n,m;
bool cmp(int x,const string &b){
vector<string> res;
string a=path[x];
int i=1,j=1; //i,j分别为a,b的指针
while(i<a.length()&&j<b.length()){
int ii=i,jj=j;
while(ii<a.length()&&a[ii]!='/') ii++;
while(jj<b.length()&&b[jj]!='/') jj++;
string mod=a.substr(i,ii-i);
string sub=b.substr(j,jj-j);
if(mod=="<int>"){
if(is_num(sub))
res.push_back(get_num(sub));
else return false;
}else if(mod=="<str>"){
res.push_back(sub);
}else if(mod=="<path>"){
res.push_back(b.substr(i));
goto end;
}else{
if(mod==sub) ;
else return false;
}
i=ii+1;
j=jj+1;
}
if(i-a.length()!=j-b.length()) return false;
end:
cout<<data[x]<<" ";
for(int i=0;i<res.size();i++)
cout<<res[i]<<" ";
cout<<endl;
return true;
}
int main(){
cin>>n>>m;
while(n--){
string s;
cin>>s;
path.push_back(s);
cin>>s;
data.push_back(s);
}
while(m--){
string b;
cin>>b;
for(int i=0;i<path.size();i++){
if(cmp(i,b)) goto end;
}
cout<<"404"<<endl;
end: ;
}
}
4.棋局评估:
思路分析:
博弈论问题,对于Alice来说她要选择当前局面下得分最高的步骤去走,因此只需得到当前的最高得分的步骤即可
如何得到?把每一个可取的位置都尝试一遍,取其中得分最高的,对于位置A,将其置为最高的步骤1,然后进行dfs,现在轮到Bob下棋,对Bob来说他要找到一个当前的最低得分来下,因此也是把每个可取的位置都尝试一遍,…不断套娃递归,直到场上下满,或者其中一方获胜为止
由于搜索的过程是最大值最小值交替搜索,因此该算法也被称为最大最小搜索
#include<iostream>
#define INF 100
using namespace std;
int a[3][3]; // 0空 1 Alice 2Bob
bool win(int x){ //判断数字x是否取胜
for(int i=0;i<3;i++){
int flag=1;
for(int j=0;j<3;j++)
if(a[i][j]!=x) {flag=0;break;}
if(flag) return 1;
}
for(int i=0;i<3;i++){
int flag=1;
for(int j=0;j<3;j++)
if(a[j][i]!=x) {flag=0;break;}
if(flag) return 1;
}
if(a[2][0]==x&&a[1][1]==x&&a[0][2]==x) return 1;
if(a[0][0]==x&&a[1][1]==x&&a[2][2]==x) return 1;
return 0;
}
int score(){ //获取当前局面下的得分
int s=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++)
s+=(a[i][j]==0);
}
if(win(1)) return s+1;
if(win(2)) return -s-1;
if(!s) return 0;
return INF;
}
int dfs(int x) //x代表当前出手人 0 Alice 1 Bob
{
int s=score();
if(s!=INF) return s;
if(!x){ //Alice 出手
int t=-INF;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(a[i][j]==0){
a[i][j]=1;
t=max(t,dfs(1));
a[i][j]=0;
}
return t;
}else{
int t=INF;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
if(a[i][j]==0){
a[i][j]=2;
t=min(t,dfs(0));
a[i][j]=0;
}
return t;
}
}
int main(){
int t;
cin>>t;
while(t--){
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>a[i][j];
cout<<dfs(0)<<endl;
}
}