CCF CSP 认证-之字转换-窗口-画图

可持久化更新中……

之字转换,第一次写之字转换是大一下刚期末考完时帮别人写的,室友三个在无人图书馆写看书写码,扯远了

CCF CSP 之字转换(zigzag转换),再次写,思路清晰多了

#include <cstdio>
const int N = 1007;
int a[N][N]; 
void work(int a[][N], int n) {
	printf("%d", a[1][1]);
	int i = 1, j = 1;
	while(true) {
		if(i == n && j == n) break;
		if(j + 1 <= n) {
			j++;
			printf(" %d", a[i][j]);
		} //向右
		else if(i + 1 <= n) {
			i++;
			printf(" %d", a[i][j]); 
		} //不能向右,就向下 
		while(j > 1 && i < n) {
			j--, i++;
			printf(" %d", a[i][j]);
		} //向左下
		if(i + 1 <= n) {
			i++;
			printf(" %d", a[i][j]);
		} //向下 
		else if(j + 1 <= n) {
			j++;
			printf(" %d", a[i][j]);
		} //向右
		while(i > 1 && j < n) {
			i--, j++;
			printf(" %d", a[i][j]);
		} //右上 
	}
	puts("");
}
int main()
{
	int n;
	while(~scanf("%d", &n)) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= n; ++j) 
				scanf("%d", &a[i][j]);
		}
		work(a, n);
	}

	return 0;
}

问题描述
  在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:

  对于下面的4×4的矩阵,
  1 5 3 9
  3 7 5 6
  9 4 6 4
  7 3 1 3
  对其进行Z字形扫描后得到长度为16的序列:
  1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
  请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。
输入格式
  输入的第一行包含一个整数n,表示矩阵的大小。
  输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。
输出格式
  输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。

CCF CSP 窗口。windows视窗操作体统的窗口模拟,list链表应用。

typo 让我错了4次。不在状态,该休息了

#include <cstdio>
#include <list> 
using namespace std;
struct Window {
	int id, x1, y1, x2, y2;
	Window(int id, int x1, int y1, int x2, int y2) :id(id), x1(x1), y1(y1), x2(x2), y2(y2) {}
};
list<Window> ls;
int main()
{
	int n, m;
	while (~scanf("%d%d", &n, &m)) {
		ls.clear();
		for (int i = 1; i <= n; ++i) {
			int x1, y1, x2, y2;
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
			ls.push_front(Window(i, x1, y1, x2, y2));
		}
		while (m-- > 0) {
			int x, y;
			scanf("%d%d", &x, &y);
			list<Window>::iterator it = ls.begin();
			for (; it != ls.end(); ++it) {
				if ((*it).x1 <= x && x <= (*it).x2 && (*it).y1 <= y && y <= (*it).y2) {
					printf("%d\n", (*it).id);
					ls.push_front(*it);
					ls.erase(it);
					break;
				}
			}
			if (it == ls.end()) {
				puts("IGNORED");
			}
		}
	}

	return 0;
}

问题描述
  在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。
  当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。
  现在我们希望你写一个程序模拟点击窗口的过程。
输入格式
  输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10)
  接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。 每行包含四个非负整数 x 1, y 1, x 2, y 2,表示该窗口的一对顶点坐标分别为 (x 1, y 1) 和 (x 2, y 2)。保证 x 1 < x 2,y 1 2。
  接下来 M 行每行包含两个非负整数 x, y,表示一次鼠标点击的坐标。
  题目中涉及到的所有点和矩形的顶点的 x, y 坐标分别不超过 2559 和  1439。
输出格式
  输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。
样例输入
3 4
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
样例输出
2
1
1
IGNORED

CCF CSP 2014画图

放在第二题,暴力上呀,两重循环。给个测试数据。3 (0, 1, 1, 2) (2, 0, 3, 1) (1, 2, 2, 3).输出 3

#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100;
bool v[N + 7][N + 7];
int main()
{
	int n;
	while(~scanf("%d", &n)) {
		memset(v, 0, sizeof v);
		int x1, y1, x2, y2;
		while(n-- > 0) {
			scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
			for (int x = x1; x < x2; ++x) {
				for (int y = y1; y < y2; ++y) {
					v[x][y] = 1;
				}
			}
		}
		int cnt = 0;
		for (int i = 0; i < N; ++i) {
			for (int j = 0; j < N; ++j) {
				if(v[i][j])
					cnt++;
			} 
		}
		printf("%d\n", cnt);
	}

	return 0;
}
问题描述
  在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
  下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。

  给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入格式
  输入的第一行包含一个整数n,表示要画的矩形的个数。
  接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
输出格式
  输出一个整数,表示有多少个单位的面积被涂上颜色。
样例输入
2
1 1 4 4
2 3 6 5
样例输出
15
评测用例规模与约定
  1<=n<=100,0<=横坐标、纵坐标<=100。

CCF CSP字符串匹配

本来还想着KMP,数据这个弱,暴力匹配上。

#include <iostream>
#include <string>
using namespace std;
string change(string str) {
	int len = str.length();
	for (int i = 0; i < len; ++i) {
		if(str[i] >= 'A' && str[i] <= 'Z') str[i] += 32;
	}
	return str;
}
int main()
{
	ios::sync_with_stdio(false);
	string t;
	while(cin >> t) { //模式串t 
		int opt, n, len;
		cin >> opt >> n;
		if(opt == 0) {
			t = change(t);
		}//全转化为小写 
		while(n-- > 0) {
			string s;
			cin >> s;
			string tmp = s;
			if(opt == 0) {
				tmp = change(s);
			}
			int found = (int)tmp.find(t);
			if(found != -1) {
				cout << s << endl;
			}
		} 
	}

	return 0;
}

问题描述
  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例说明
  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
  1<=n<=100,每个字符串的长度不超过100



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值