2014年9月CCF软考试题

A.相邻数对

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

水题,,,

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	vector<int> vt;
	int ans=0;
	for(int i=0;i<n;i++){
		int temp;
		scanf("%d",&temp);
		for(int j=0;j<vt.size();j++){
			if(abs(temp-vt[j])==1){
				ans++;
			}
		}
		vt.push_back(temp);
	}
	printf("%d",ans);
	return 0;
}
/*
7
1 2 3 4 5 6 7
6

5
-1 0 2 3 6
2
*/

B.画图

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

和14年3月份的窗口异曲同工,感觉比那个要简单。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=110;
int G[MAXV][MAXV];
int n;
struct Node{
	int x1;int y1;
	int x2;int y2;
}noset[MAXV];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d%d",&noset[i].x1,&noset[i].y1,&noset[i].x2,&noset[i].y2);
	}
	memset(G,0,sizeof(G));
	for(int i=1;i<=n;i++){
		for(int j=noset[i].x1;j<noset[i].x2;j++){
			for(int k=noset[i].y1;k<noset[i].y2;k++){
				G[j][k]=i;
			}
		}
	}
	int ans=0;
	for(int i=0;i<MAXV;i++){
		for(int j=0;j<MAXV;j++){
			if(G[i][j]!=0) ans++;
		}
	}
	printf("%d",ans);
	return 0;
} 

C.字符串匹配

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

水题,大小写的区分只要判断值是否差32即可解决。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
	char buf[110];
	scanf("%s",buf);
	string std(buf);
	int t,n;
	scanf("%d%d",&t,&n);
	vector<string> vs;
	for(int i=0;i<n;i++){
		scanf("%s",buf);
		string s(buf);
		vs.push_back(s); 
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<vs[i].size();j++){
			bool ok=true;
			for(int k=0;k<std.length();k++){
				if(t){			//区分大小写 
					if(j+k>=vs[i].size() || vs[i][j+k]!=std[k]){
						ok=false;
						break;
					}
				}else{			//不区分 
					if(j+k>=vs[i].size() || ( vs[i][j+k]!=std[k] && abs(vs[i][j+k]-std[k])!=32 ) ){
						ok=false;
						break;
					}
				}
			}
			if(ok){
				printf("%s\n",vs[i].c_str());
				break;
			}
		}
	}
	return 0;
}
/*
Hello
0
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
*/

D.最优配餐

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

再次遇到BFS题目,这个不是从一个点开始的,要把多个点push进队列,另外不能置这些点为已访问过,因为每个商店的配送时可以路过其它商店。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXV=1010;
const int ROAD=0;
const int STOP=-1;
int visit[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 
int n,m,k,d;
ll G[MAXV][MAXV];
ll allneed=0;
struct status{
	int x,y;
	ll step;
}shop[MAXV*MAXV];
bool visited[MAXV][MAXV];
ll bfs(){
	ll ans=0;
	queue<status> q;
	memset(visited,false,sizeof(visited));
	for(int i=0;i<m;i++){
		q.push(shop[i]);
	}
	while(!q.empty()){
		status front=q.front();
		q.pop();
		if(allneed==0) return ans;
		if(G[front.x][front.y]>0){
			ans+=front.step*G[front.x][front.y];
			allneed-=G[front.x][front.y];
			G[front.x][front.y]=ROAD;
		}else if(G[front.x][front.y]==STOP){			//不能行走不访问 
			continue;
		}
		//向四个方向走 
		for(int i=0;i<4;i++){
			status st;
			st.x=front.x+visit[i][0];
			st.y=front.y+visit[i][1];
			if(st.x<=n && st.x>=1 && st.y<=n && st.y>=1 && !visited[st.x][st.y]){
				st.step=front.step+1;
				visited[st.x][st.y]=true;
				q.push(st);
			}
		}
	}
	return ans;
}
int main(){
	fill(G[0],G[0]+MAXV*MAXV,ROAD);
	scanf("%d%d%d%d",&n,&m,&k,&d);
	for(int i=0;i<m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		shop[i].x=x;
		shop[i].y=y;
		shop[i].step=0;
	}
	for(int i=0;i<k;i++){
		int x,y,num;
		scanf("%d%d%d",&x,&y,&num);
		G[x][y]+=num;
		allneed+=num;
	}
	for(int i=0;i<d;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		G[x][y]=STOP;
	}
	printf("%lld",bfs());
	return 0;
}
/*
10 2 4 3
1 1
8 8
1 5 1
1 5 1
2 3 3
6 7 2
1 2
2 2
6 8

37
*/

E.拼图

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

再次留下最后这道题,不会,日后补上,ps:发现底下对数据的描述其实可以写些针对小数据的简单算法,得个10分20分的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值