2014年3月CCF软考试题

本文解析了五道编程挑战题,包括相反数查找、窗口模拟、命令行选项解析、无线网络路径寻找及任务调度算法,涉及数据结构、算法及编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.相反数

题目链接:http://118.190.20.162/view.page?gpid=T10

水题,但是我第一次提交竟然是0分惊了,这要是考试现场不就gg了吗,简单题还是要细心!

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int N;
	scanf("%d",&N);
	set<int> st;
	int count=0;
	for(int i=0;i<N;i++){
		int tmp;
		scanf("%d",&tmp);
		st.insert(tmp);
		if(st.find(-tmp)!=st.end()){
			count++;
		}
	}
	printf("%d",count);
	return 0;
} 

B.窗口

题目链接:http://118.190.20.162/view.page?gpid=T9

一道小模拟题,用一个二维数组来表示屏幕状态就好了,然后按着要求进行模拟覆盖,但是不知道为什么我的程序一直是90分,不知道哪里有个小错误,找不到懒得找了。。。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=20;
int N,M;
struct Window{
	int x1;
	int y1;
	int x2;
	int y2;
};
Window aw[MAXV];
int number[MAXV];
int pm[2700][1500];
void fg(){
	memset(pm,0,sizeof(pm));
	for(int i=1;i<=N;i++){
		for(int j=aw[i].x1;j<=aw[i].x2;j++){
			for(int k=aw[i].y1;k<=aw[i].y2;k++){
				pm[j][k]=number[i];
			}
		}
	}
}
int main(){
	scanf("%d%d",&N,&M);
	for(int i=1;i<=N;i++){
		int a,b,c,d;
		scanf("%d%d%d%d",&a,&b,&c,&d);
		aw[i].x1=a;aw[i].y1=b;
		aw[i].x2=c;aw[i].y2=d;
		number[i]=i;
	}
	fg();
	while(M--){
		int x,y;
		scanf("%d%d",&x,&y);
		if(pm[x][y]){
			int num=pm[x][y];
			printf("%d\n",num);
			swap(aw[num],aw[N]);
			swap(number[num],number[N]);
			fg();
		}else{
			printf("IGNORED\n");
		}
	}
	return 0;
}

C.命令行选项

题目链接:http://118.190.20.162/view.page?gpid=T8

这个题简直了,看半天才看懂~.~真不知道考场上遇到这样的题会不会心态爆炸,看懂题后其实不是很难做,就是一个字符串的处理工作。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int WC=0;
const int YC=1;
map<char,int> mp;
vector<string> vs;
map<string,string> cs;
void split(string s,char c){
	int start=0;
	for(int i=0;i<s.length();i++){
		if(s[i]==c){
			vs.push_back(s.substr(start,i-start));
			start=i+1;
		}
	}
	if(start<s.length()){
		vs.push_back(s.substr(start,s.length()-start));
	}
}
set<string> getRel(){
	set<string> srel;
	for(int i=1;i<vs.size();i++){
		if(vs[i].length()==2 && vs[i][0]=='-' && mp.find(vs[i][1])!=mp.end()){
			for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){
				if(vs[i][1]==it->first){
					if(it->second==WC){
						srel.insert(vs[i]);
					}else if(it->second==YC && i+1<vs.size()){
						srel.insert(vs[i]);
						cs[vs[i]]=vs[i+1];
						i++;
					}
					break;
				}
			}
		}else{
			break;
		} 
	}
	return srel;
}
int main(){
	char buf[100];
	scanf("%s",buf);
	string s(buf);
	for(int i=0;i<s.length();i++){
		if(i+1<s.length() && s[i+1]==':'){
			mp[s[i]]=YC;
			i++;
		}else{
			mp[s[i]]=WC;
		}
	}
	int N;
	scanf("%d",&N);
	getchar();
	for(int i=1;i<=N;i++){
		vs.clear();
		cs.clear();
		gets(buf);
		string str(buf);
		split(str,' ');
		set<string> srel=getRel();
		printf("Case %d:",i);
		for(set<string>::iterator it=srel.begin();it!=srel.end();it++){
			string ts=*it;
			printf(" %s",ts.c_str());
			if(mp[ts[1]]==YC){
				printf(" %s",cs[ts].c_str());
			}
		}
		printf("\n");
	}
	return 0;
} 

D. 无线网络

题目链接:http://118.190.20.162/view.page?gpid=T7

一道BFS试题,很少做BFS题目,但是发现第四道基本都是这样,一定要多做多练习这样的题目。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=210;
typedef long long ll;
ll n,m,k,r;
struct Node{
	ll x,y;
}noset[MAXV];
struct status{
	ll x,y;
	int step,kcount;
};
bool visited[MAXV];
int bfs(){
	queue<status> q;
	memset(visited,false,sizeof(visited));
	status start,end;
	start.x=noset[0].x;end.x=noset[1].x;
	start.y=noset[0].y;end.y=noset[1].y;
	start.step=0;
	start.kcount=0;
	q.push(start);
	visited[0]=true;
	int max;
	while(!q.empty()){
		status tpn=q.front();
		q.pop();
		if(tpn.x==end.x && tpn.y==end.y){
			return tpn.step-1;
		}
		if(tpn.kcount==k){
			max=n;
		}else{
			max=n+m;
		}
		for(int i=0;i<max;i++){
			if(visited[i]) continue;
			if((noset[i].x-tpn.x)*(noset[i].x-tpn.x)+(noset[i].y-tpn.y)*(noset[i].y-tpn.y)<=r*r){
				visited[i]=true;
				status st;
				st.x=noset[i].x;
				st.y=noset[i].y;
				if(i>=n){
					st.kcount=tpn.kcount+1;
				}else{
					st.kcount=tpn.kcount;
				}
				st.step=tpn.step+1;
				q.push(st);
			}
		}
	}
	return 0;
}
int main(){
	scanf("%d%d%d%d",&n,&m,&k,&r);
	for(int i=0;i<n+m;i++){
		ll x,y;
		scanf("%lld%lld",&x,&y);
		noset[i].x=x;
		noset[i].y=y;
	}
	printf("%d",bfs());
	return 0;
} 

E.任务调度

题目链接:http://118.190.20.162/view.page?gpid=T6

不会!!!先放这,刷完剩下的回来补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值