CSP 2018-3

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;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值