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

来源:互联网 发布:关键词优化简易 编辑:程序博客网 时间:2024/05/16 08:55

可持久化更新中……

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

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 个窗口的位置。 每行包含四个非负整数 x1, y1, x2, y2,表示该窗口的一对顶点坐标分别为 (x1, y1) 和 (x2, y2)。保证 x1 < x2,y1 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



原创粉丝点击