[ZOJ 3839] Poker Face (递归)

时间:2024-01-15 18:52:02

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3839

题目大意:画脸。。每张脸是上一个脸倒过来加上眼睛。。

注意n<8时停止,被这个坑惨了- -以为是0停止。。

递归,然后去推坐标公式。。

 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> vec;
typedef vector<vec> mat;
#define AA first
#define BB second char s[][]; void solve(int x,int y,int si,bool seq){
// printf("[solve]:x=%d,y=%d,si=%d\n",x,y,si);
if( si== ){
// return;
if( seq ){
for(int i=x;i<x+si;i++){
if( i==x||i==x+si-){
for(int j=y;j<y+si;j++){
s[i][j] = '*';
}
} else {
for(int j=y;j<y+si;j++){
if( (i>=x+&&i<=x+)&&(j<=y+||(j>=y+&&j<=y+)) ) s[i][j] = '*';
else if( i==x+&&(j==y||(j>=y+&&j<=y+)||j==y+) ) s[i][j] = '*';
else if( (i==x+||i==x+)&&(j==y||j==y+||j==y+||j==y+) ) s[i][j] = '*';
else s[i][j] = ' ';
}
}
}
} else {
for(int i=x;i>x-si;i--){
if( i==x||i==x-si+ ){
for(int j=y;j>y-si;j--){
s[i][j] = '*';
}
} else {
for(int j=y;j>y-si;j--){
if( (i<=x-&&i>=x-)&&(j>=y-||(j<=y-&&j>=y-)) ) s[i][j] = '*';
else if( i==x-&&(j==y||(j<=y-&&j>=y-)||j==y-) ) s[i][j] = '*';
else if( (i==x-||i==x-)&&(j==y||j==y-||j==y-||j==y-) ) s[i][j] = '*';
else s[i][j] = ' ';
}
}
}
}
return;
}
if( seq ){
for(int i=x;i<x+si;i++ ){
if( i==x||i==x+si- ){
for(int j=y;j<y+si;j++){
s[i][j] = '*';
}
} else {
for(int j=y;j<y+si;j++){
if( j==y||j==y+si- ) s[i][j] = '*';
else if( (i==x+si/||i==x+si/+si/)&&((j>=y+si/&&j<=y+si/+si/-)||(j<=y+si-si/-&&j>=y+si-si/-si/)) ) {
s[i][j] = '*';
}
else if( (i>x+si/&&i<x+si/+si/)&&(j==y+si/||j==y+si/+si/-||j==y+si-si/-||j==y+si-si/-si/) ) s[i][j] = '*';
else s[i][j] = ' ';
}
}
}
solve(x+si-,y+si-si/-,si/,!seq);
} else {
for(int i=x;i>x-si;i-- ){
if( i==x||i==x-si+ ){
for(int j=y;j>y-si;j--){
s[i][j] = '*';
}
} else {
for(int j=y;j>y-si;j--){
if( j==y||j==y-si+ ) s[i][j] = '*';
else if( (i==x-si/||i==x-si/-si/)&&((j<=y-si/&&j>=y-si/-si/+)||(j>=y-si+si/+&&j<=y-si+si/+si/)) ) {
s[i][j] = '*';
}
else if( (i<x-si/&&i>x-si/-si/)&&(j==y-si/||j==y-si/-si/+||j==y-si+si/+||j==y-si+si/+si/) ) s[i][j] = '*';
else s[i][j] = ' ';
}
}
}
solve(x-si+,y-si+si/+,si/,!seq);
}
} int n; int main(){
while( ~scanf("%d",&n) ){
if(n < )break;
solve(,,n,true);
for(int i=;i<n;i++){
s[i][n] = '\0';
//for(int j=0;j<n;j++){
printf("%s\n",s[i]);
// }
// puts("");
}
puts("");
}
// solve(31,31,32,false); return ;
}