可持久化更新中……
之字转换,第一次写之字转换是大一下刚期末考完时帮别人写的,室友三个在无人图书馆写看书写码,扯远了
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字形扫描的结果。
对于下面的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+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。
接下来 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
0 0 4 4
1 1 5 5
2 2 6 6
1 1
0 0
4 4
0 5
样例输出
2
1
1
IGNORED
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个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形都涂成统一的颜色,图中显示不同颜色仅为说明方便。
给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入格式
输入的第一行包含一个整数n,表示要画的矩形的个数。
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。
输出格式
输出一个整数,表示有多少个单位的面积被涂上颜色。
样例输入
2
1 1 4 4
2 3 6 5
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行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
HiHiHelloHiHi
HELLOisNOTHello
样例说明
在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
1<=n<=100,每个字符串的长度不超过100