Thứ Ba, 8 tháng 1, 2019

UVa 00255 - Correct Move (check the validity of chess moves)

Link: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=191
Sol:
#include <bits/stdc++.h>
using namespace std;
int k, q, m;
set<int> lk, lq, diff;
void getLK(){
lk.clear();
if(k - 8 >= 0 && k - 8 != q){
lk.insert(k - 8);
}
if(k + 8 < 64 && k + 8 != q){
lk.insert(k + 8);
}
if((k - 1) / 8 == k / 8 && k - 1 != q){
lk.insert(k - 1);
}
if((k + 1) / 8 == k / 8 && k + 1 != q){
lk.insert(k + 1);
}
}
void getLQ(){
lq.clear();
int x;
x = q - 8;
while(x >= 0 && x != k){
lq.insert(x);
x -= 8;
}
x = q + 8;
while(x < 64 && x != k){
lq.insert(x);
x += 8;
}
x = q - 1;
while(x / 8 == q / 8 && x != k){
lq.insert(x);
x--;
}
x = q + 1;
while(x / 8 == q / 8 && x != k){
lq.insert(x);
x++;
}
}
int main(){
while(scanf("%d %d %d", &k, &q, &m) != EOF){
if(k == q){
printf("Illegal state\n");
continue;
}
getLQ();
if(lq.count(m) == 0){
printf("Illegal move\n");
continue;
}
getLK();
for(auto k : lk){
lq.erase(k);
}
if(lq.count(m) == 0){
printf("Move not allowed\n");
continue;
}
q = m;
getLK();
getLQ();
for(auto k : lq){
lk.erase(k);
}
if(lk.size() == 0){
printf("Stop\n");
}
else{
printf("Continue\n");
}
}
}

Không có nhận xét nào:

Đăng nhận xét

Bài G - Educatioal Round 62

Đề bài: Bạn được cho 1 đồ thị vô hướng đặc biệt. Nó bao gồm $2n$ đỉnh được đánh số từ 1 đến 2n. Dưới đây là một số đặc tính của đồ thị: + ...