CCF CSP 창 정보

坏嘻嘻
풀어 주다: 2018-09-14 14:02:16
원래의
2356명이 탐색했습니다.

XSS 크로스 사이트 스크립팅 공격, 가짜 콘텐츠와 클릭 미끼를 통해 동일 출처 정책을 우회합니다. 이는 큰 문제이며, 공격자가 코드 삽입에 성공하면 상당한 양의 사용자 데이터가 유출될 수 있습니다.

문제 설명

 특정 그래픽 운영 체제에는 N개의 창이 있고 각 창은 양쪽이 좌표축에 평행한 직사각형 영역입니다. 창 경계에 있는 점도 창에 속합니다. 창 간에는 계층적 차이가 있습니다. 두 개 이상의 창이 겹치는 영역에서는 최상위 창의 내용만 표시됩니다.
화면의 한 지점을 클릭하면 클릭한 위치의 최상위 창을 선택하게 되며, 이 창은 모든 창의 최상위 창으로 이동되며 나머지 창의 계층 순서는 변경되지 않습니다. 클릭한 위치가 어떤 창에도 속하지 않는 경우 시스템은 클릭을 무시합니다.
이제 창을 클릭하는 과정을 시뮬레이션하는 프로그램을 작성해 보겠습니다.

입력 형식

 입력의 첫 번째 줄에는 두 개의 양의 정수, 즉 N과 M이 포함됩니다. (1  N  10,1  M  10)
 다음 N줄은 N개의 창 위치를 아래에서 위로 순서대로 나타냅니다. 각 줄에는 창 (x1, y1) 및 (x2, y2)의 정점 좌표 쌍을 나타내는 음이 아닌 정수 4개 x1, y1, x2, y2가 포함되어 있습니다. x1  다음 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
무시

설명 예시

 처음 클릭한 위치는 1번 창과 2번 창에 모두 속하지만, 2번 창이 맨 위에 있으므로 선택되어 맨 위로 올라옵니다.
 두 번째 클릭의 위치는 첫 번째 창에만 속하므로 이 클릭을 하면 이 창을 선택하여 맨 위로 가져옵니다. 이제 세 창 사이의 계층 관계는 초기 상태와 정반대입니다.
 세 번째 클릭한 위치는 동시에 3개의 창 범위에 속하지만, 이제 첫 번째 창이 맨 위에 있으므로 선택됩니다.
 마지막 클릭(0, 5)은 어떤 창에도 속하지 않습니다.

분석: 순서대로만 정리하면 그리 어렵지도 않은 아주 간단한 질문입니다.

#include <iostream>
#include<vector>
using namespace std;

int main()
{
	int N, M;
	cin >> N >> M;
	vector<int>win;
	vector<int>::iterator it;
	for (int i = N; i > 0; i--)
	{
		win.push_back(i);
	}
	int position[11][4];
	int cli[13][2];
	for (int i = 1; i <= N; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			cin >> position[i][j];
		}
	}
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < 2; j++)//由于写这个的时候精神状态不是很好,原来写成j>2了。后来实在找不到哪里错了,只好把for循环重写了一遍。
		{
			cin >> cli[i][j];
		}
	}
	for (int i = 0; i < M; i++)
	{
		bool you = true;
		for (int j = 0; j < N; j++)
		{
			if (cli[i][0] >= position[win[j]][0] && cli[i][0] <= position[win[j]][2] && cli[i][1] >= position[win[j]][1] && cli[i][1] <= position[win[j]][3])
			{
				cout << win[j] << endl;
				you = false;
				if (j != 0)
				{
					int a = win[j];
					for (it = win.begin(); it != win.end();)
					{
						if (*it == a)
						{
							it = win.erase(it);
						//	break;
						}   //删除元素,返回值指向已删除元素的下一个位置
						else
						{
							++it;
						}    //指向下一个位置
					}
					win.insert(win.begin(), a);
				}
				break;
			}
		}
		if (you)
		{
			cout << "IGNORED" << endl;
		}
		
	}
	return 0;
}
로그인 후 복사

관련 권장 사항:

HTML5 보안 소개 - 콘텐츠 보안 정책(CSP) 소개_html5 튜토리얼 기술

html5 기본 태그(html5 비디오 태그 html5 새 태그 사용)_html5 튜토리얼 기술

위 내용은 CCF CSP 창 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!