CCF201312--模拟练习试题参考答案(C++)

来源:CCF计算机职业资格网站


问题参见:CCF201312赛题


为了帮助大家熟悉 CCF 软件能力认证考试的操作方式与答题环境,了解试题的大致难度,做好考前的准备,故在此提供试题的参考答案。C++程序是灵活的,为了解决同一个问题,即使结果相同,程序的内容也不一定是完全一致的,仅供各位在练习时参考。


1. 出现次数最多的数

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <map>

using namespace std;

int main()
{
	int n;
	cin >> n;
	map<int, int> f;
	for (int i = 0; i < n; i++)
	{
		int t;
		cin >> t;
		f[t]++;
	}
	int ans, m = 0;
	for (map<int, int>::iterator it = f.begin(); it != f.end(); it++)
	{
		if (it->second > m)
		{
			m = it->second;
			ans = it->first;
		}
	}
	cout << ans << endl;
	return 0;
}

2. ISBN 号码

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <map>

using namespace std;

int a[10];

int main()
{
	string s;
	cin >> s;
	a[0] = s[0] - '0';
	a[1] = s[2] - '0';
	a[2] = s[3] - '0';
	a[3] = s[4] - '0';
	a[4] = s[6] - '0';
	a[5] = s[7] - '0';
	a[6] = s[8] - '0';
	a[7] = s[9] - '0';
	a[8] = s[10] - '0';
	a[9] = s[12] - '0';
	
	int sum = 0;
	for (int i = 0, j = 1; i < 9; i++, j++)
	{
		sum += a[i] * j;
	}
	int code = sum % 11;
	char c = code == 10 ? 'X' : '0' + code;
	if (s[12] == c)
	{
		cout << "Right" << endl;
	} else
	{
		s[12] = c;
		cout << s << endl;
	}
	return 0;
}


3.最大的矩形

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <deque>
#include <list>

using namespace std;

int main()
{
	int n;
	vector<int> a;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		a.push_back(x);
	}
	int ans = 0;
	for (int i = 0; i < n; i++)
	{
		int h = a[i];
		for (int j = i; j < n; j++)
		{
			if (a[j] < h)
				h = a[j];
			int s = (j - i + 1) * h;
			if (ans < s)
				ans = s;
		}
	}
	cout << ans << endl;
	return 0;
}

4.有趣的数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <deque>
#include <list>

using namespace std;

long long f[2000][3][2]; // f[seq_k to place][0: to place 0 , 1: ethier 0 or 1, 2 : must be 1][3 is placed ? 1 : 0]
int dp(int n, int p1, int p3)
{
	long long &now = f[n][p1][p3];
	if (now != -1)
		return now;
	if (n == 0)
	{
		if (p1 == 2 && p3 == 1)
		{
			now = 1;
		} else
		{
			now = 0;
		}
		return now;
	}
	now = 0;
	if (p1 == 0)
	{
		now += dp(n-1, 1, p3); // go 0
	}else if (p1 == 1)
	{
		now += dp(n-1, 1, p3); // go 0now += dp(n-1, 2, p3); // go 1
	}else // p1 == 2
	{
		now += dp(n-1, 2, p3); // go 1
	}
	if (p3 == 0)
	{
		now += dp(n-1, p1, p3); // go 2;
		now += dp(n-1, p1, 1); // go 3;
	}else
	{
		now += dp(n-1, p1, 1); // go 3;
	}
	now %= 1000000007;
}

int main()
{
	int n;
	cin >> n;
	memset(f, -1, sizeof(f));
	int ans = dp(n - 1, 0, 0); // seq[n] is 2
	cout << ans << endl;
	return 0;
}

5.I’m stuck!

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <deque>
#include <cstring>
#include <list>

using namespace std;

//

class Move
{
	public:
		virtual bool CanMove(char from, char to, int dx, int dy) = 0;
};

class ForwardMove : public Move
{
	public:
		virtual bool CanMove(char from, char to, int dx, int dy)
	{
		if (to == '#') return false;
		switch (from)
		{
			case '+' : case 'S' : case 'T' : return true; break;
			case '-' : return dy != 0; break;
			case '|' : return dx != 0; break;
			case '.' : return dx == 1; break;
		}
		return false;
	}
};

class BackwardMove : public Move
{
	public:
		virtual bool CanMove(char from, char to, int dx, int dy)
	{
		if (to == '#') return false;
		switch (to)
		{
			case '+' : case 'S' : case 'T' : return true; break;
			case '-' : return dy != 0; break;
			case '|' : return dx != 0; break;
			case '.' : return dx == -1; break;
		}
		return false;
	}
};

char s[100][100];
typedef bool ARR[100][100];
ARR bs, bt;
int sx, sy, tx, ty;int d[4][2] = {{-1, 0},{1, 0},{0, 1},{0, -1}};

void Bfs(ARR b, Move *move, int x, int y)
{
	if (b[x][y])
	return;
	b[x][y] = true;
	for (int o = 0; o < 4; o++)
	{
		int dx = d[o][0];
		int dy = d[o][1];
		int xx = x + dx;
		int yy = y + dy;
		if (move->CanMove(s[x][y], s[xx][yy], dx, dy))
		{
			Bfs(b, move, xx, yy);
		}
	}
}

int n, m;

int main()
{
	cin >> n >> m;
	for (int i = 0; i <= n + 1; i++)
		for (int j = 0; j <= m + 1; j++)
			s[i][j] = '#';
	for (int i = 1; i <= n; i++)
		cin >> s[i]+1;
	for (int i = 0; i <= n + 1; i++)
		s[i][m + 1] = '#';
	for (int i = 0; i <= n + 1; i++)
	{
		for (int j = 0; j <= m + 1; j++)
		{
			if (s[i][j] == 'S')
			{
				sx = i;sy = j;
			}
			if (s[i][j] == 'T')
			{
				tx = i;
				ty = j;
			}
		}
	}
	Bfs(bs, new ForwardMove(), sx, sy);
	Bfs(bt, new BackwardMove(), tx, ty);
	int ans = 0;
	for (int i = 0; i <= n + 1; i++)
	{
		for (int j = 0; j <= m + 1; j++)
		{
			if (bs[i][j] && ! bt[i][j])
				ans ++;
		}
	}
	if (bs[tx][ty] == false)
		cout << "I'm stuck!" << endl;
	else
		cout << ans << endl;
	return 0;
}


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值