Untitled
unknown
plain_text
2 years ago
8.3 kB
25
Indexable
// bai 1 – invite wedding
#include<iostream>
// code 100/100
using namespace std;
int dinh, canh;
int u, v;
int maTranKe[101][101];
int visited[101];
int cntVisit[101];
void dfs(int d){
if(d == v){
for (int i = 1; i <= dinh; i++)
{
if(visited[i] == 1){
cntVisit[i]++;
}
}
return;
}
for (int i = 1; i <= dinh; i++)
{
if(visited[i] == 0 && maTranKe[d][i] == 1){
visited[i] = 1;
dfs(i);
visited[i] = 0;
}
}
}
int cnt_dinh(){
int cnt = 0;
for (int i = 1; i <= dinh; i++)
{
if(cntVisit[i] == cntVisit[v]){
cnt++;
}
}
return cnt-2;
}
void create(){
for (int i = 1; i <= dinh; i++)
{
for (int j = 1; j <= dinh; j++)
{
maTranKe[i][j] = 0;
}
cntVisit[i] = 0;
visited[i] = 0;
}
}
int main(int argc, char** argv)
{
int test_case;
int T;
int Answer;
int d1, d2;
// freopen("input.txt", "r", stdin);
cin >> T;
for(test_case = 1; test_case <= T; ++test_case)
{
Answer = 0;
cin >> dinh >> canh >> u >> v;
create();
for (int i = 0; i < canh; i++)
{
cin >> d1 >> d2;
maTranKe[d1][d2] = 1;
}
visited[u] = 1;
dfs(u);
Answer = cnt_dinh();
// Print the answer to standard output(screen).
cout << Answer << endl << endl;
}
return 0;//Your program should return 0 on normal termination.
}
//bai 2 – mario Climb
#include<iostream>
using namespace std;
int N, M;
int map[55][55];
int visit[55][55];
int ans;
int dR[4] = {0, -1, 0, 1};
int dC[4] = {-1, 0, 1, 0};
struct COOR {
int r, c;
} Queue[2505];
int front, rear;
void init() {
front = rear = -1;
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
visit[i][j] = 0;
}
void push(int r, int c) {
rear++;
Queue[rear].r = r;
Queue[rear].c = c;
}
COOR pop() {
return Queue[++front];
}
bool isEmpty() {
return front == rear;
}
int BFS(COOR start, COOR end) {
init();
visit[start.r][start.c] = 1;
push(start.r, start.c);
while (!isEmpty()) {
COOR coor = pop();
for (int i = 0; i < 4; i++) {
int nC = coor.c + dC[i];
for (int j = 1; j <= ans; j++) {
int nR = coor.r;
if (dR[i] != 0)
nR += (j * dR[i]);
if (nR >= 0 && nR < N && nC >= 0 && nC < M && !visit[nR][nC] && map[nR][nC]) {
if (nR == end.r && nC == end.c) {
return 1;
}
visit[nR][nC] = 1;
push(nR, nC);
}
}
}
}
return 0;
}
int main() {
int T;
//freopen("sample_input.txt", "r", stdin);
cin >> T;
for (int test_case = 1; test_case <= T; ++test_case) {
cin >> N >> M;
COOR start, end;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
if (map[i][j] == 2) {
start.r = i; start.c = j;
}
if (map[i][j] == 3) {
end.r = i; end.c = j;
}
}
}
ans = 1;
while (!BFS(start, end)) {
ans++;
}
cout << "Case #" << test_case << endl << ans << endl;
}
return 0;
}
/// bai 3: dominating area
#include<iostream>
using namespace std;
int N;
int arr[101][101];
int tempArr[101][101];
int Q[1000000][3];
int front, rear;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
int visited[101][101];
int cntArr[6];
int cntArea;
void clear_queue(){
front = rear = 0;
}
void clear_arr(){
for (int i = 0; i < 6; i++)
{
cntArr[i] = 0;
}
}
void clear_visited(){
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
visited[i][j] = 0;
}
}
}
void clear(){
clear_arr();
clear_queue();
clear_visited();
}
void start_queue(int row, int col){
front = rear = 0;
Q[rear][0] = 0;
Q[rear][1] = row;
Q[rear++][2] = col;
visited[row][col] = 1;
}
void start_area(){
//int temp = 0;
while(front != rear){
int value = Q[front][0];
int row = Q[front][1];
int col = Q[front++][2];
for (int i = 0; i < 4; i++)
{
int x = row+dx[i];
int y = col+dy[i];
if(x < 0 || x >= N || y < 0 || y >= N){
continue;
}
else{
if(arr[x][y] == 0 && visited[x][y] == 0){
Q[rear][0] = 0;
Q[rear][1] = x;
Q[rear++][2] = y;
visited[x][y] = 1;
}
}
}
}
}
void cnt_array(){
int start = 0;
for (int i = 0; i < rear; i++)
{
cntArr[Q[i][0]]++;
}
}
void bfs(int row, int col){
start_queue(row, col);
start_area();
front = 0;
while(front != rear){
int value = Q[front][0];
int row = Q[front][1];
int col = Q[front++][2];
for (int i = 0; i < 4; i++)
{
int x = row+dx[i];
int y = col+dy[i];
if(x < 0 || x >= N || y < 0 || y >= N){
continue;
}
else{
if((value == 0 || (value != 0 && value == arr[x][y])) && visited[x][y] == 0 ){
Q[rear][0] = arr[x][y];
Q[rear][1] = x;
Q[rear++][2] = y;
visited[x][y] = 1;
}
}
}
}
cnt_array();
int max = 0;
int index = 0;
for (int i = 1; i < 6; i++)
{
if(cntArr[i] >= max){
max = cntArr[i];
index = i;
}
}
int start = 0;
while (Q[start][0] == 0){
tempArr[Q[start][1]][Q[start][2]] = index;
start++;
}
}
void find(){
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if(arr[i][j] == 0 && visited[i][j] == 0){
bfs(i, j);
clear_queue();
clear_arr();
clear_visited();
}
}
}
}
void cnt_area(int vtRoot, int vt){
int row = vt/N;
int col = vt%N;
if(vt >= N*N){
return;
}
if(visited[row][col] == 1){
if(vt==vtRoot){
cnt_area(vtRoot+1, vt+1);
}
return;
}
visited[row][col] = 1;
for (int i = 0; i < 4; i++)
{
int x = row+dx[i];
int y = col+dy[i];
if(x < 0 || x >= N||y < 0|| y >= N){
continue;
}
else{
if(tempArr[x][y] == tempArr[row][col] && visited[x][y] == 0){
cnt_area(vtRoot, x*N+y);
//visited[x][y] = 1;
}
}
}
if(vt == vtRoot){
cntArea++;
cnt_area(vtRoot+1, vt+1);
}
}
int main(int argc, char** argv)
{
int test_case;
int T;
int Answer;
// freopen("iput.txt", "r", stdin);
cin >> T;
for(test_case = 1; test_case <= T; ++test_case)
{
Answer = 0;
cin >> N;
clear();
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> tempArr[i][j];
arr[i][j] = tempArr[i][j];
}
}
find();
cntArea = 0;
cnt_area(0, 0);
cout << "Case #" << test_case << endl << cntArea << endl;
}
return 0;
}
// bai 5 Ads
#include <iostream>
using namespace std;
struct Visitors
{
int time_arri, time_dura, v_point;
}Visitors[51];
struct Advertisement
{
int time_ad, point;
}QC[5];
struct AD_ST_EN
{
int st, en;
}AD_ST_EN[5];
int HV[6][3] = {
{1,2,3},
{1,3,2},
{2,1,3},
{2,3,1},
{3,1,2},
{3,2,1} };
int nVistors;
int res;
void Input(){
cin >> nVistors;
for(int i = 1; i <= 3; i++){
cin >> QC[i].time_ad;
}
for(int i = 1; i <= 3; i++){
cin >> QC[i].point;
}
for(int i = 0; i < nVistors; i++){
cin >> Visitors[i].time_arri >> Visitors[i].time_dura;
}
res = 0;
}
int GetPoint(){
int tong = 0;
for(int i = 0; i < nVistors; i++){
int p_max = 0;
for(int j = 1; j <=3 ; j++){
if(Visitors[i].time_arri <= AD_ST_EN[j].st && Visitors[i].time_arri + Visitors[i].time_dura - 1 >= AD_ST_EN[j].en){
if(QC[j].point > p_max) p_max = QC[j].point;
}
}
tong = tong + p_max;
}
return tong;
}
void backtrack(int hv, int idx_ad, int t_next){
if(idx_ad == 3){
int s_point = GetPoint();
if(res < s_point) res = s_point;
return;
}
int ad_ith = HV[hv][idx_ad];
int ad_time = QC[ad_ith].time_ad;
int ad_point = QC[ad_ith].point;
for(int i = t_next; i <= 50 - ad_time; i++){
if(50 - i >= ad_time){
AD_ST_EN[ad_ith].st = i;
AD_ST_EN[ad_ith].en = i + ad_time - 1;
backtrack(hv, idx_ad + 1, i + ad_time);
AD_ST_EN[ad_ith].st = 0;
AD_ST_EN[ad_ith].en = 0;
}
}
backtrack(hv, idx_ad + 1, t_next);
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(NULL);
// freopen("input.txt", "r", stdin);
int T; cin >> T;
for(int tc = 1; tc <= T; tc ++) {
Input();
for(int i = 0; i < 6; i++){
backtrack(i,0,1);
}
cout << "Case #" << tc << endl;
cout << res << endl;
}
return 0;
}
Editor is loading...