叠筐
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24842 Accepted Submission(s): 6554
Problem Description
需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。
Input
输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;
Output
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
Sample Input
11 B A
5 @ W
Sample Output
AAAAAAAAA
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
AAAAAAAAA
@@@
@WWW@
@W@W@
@WWW@
@@@
Author
qianneng
Source
问题连接:HDU2074 叠筐
解题思路:不使用模拟,另类的用bfs(广度优先搜索)解决。
注意:
1.多组数据,处理到文件结束,如果既没有写!=EOF也没有用~scanf()程序不能AC
2.最后一个输出后面没有空行
AC的C++代码:
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N=82;
char a[2],g[N][N];
bool vis[N][N];//标记数组
struct Dir{//方向
int x,y;
}dir[8]={{-1,0},{1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
struct Node{
int x,y,i;
Node(){}
Node(int x,int y,int i):x(x),y(y),i(i){}
};
int n;
void bfs(int x,int y,int i)
{
queue<Node>q;
q.push(Node(x,y,i));
while(!q.empty()){
Node e=q.front(),v;
q.pop();
if(!vis[e.x][e.y]){
vis[e.x][e.y]=true;
g[e.x][e.y]=a[e.i];
for(int i=0;i<8;i++){
v.x=e.x+dir[i].x;
v.y=e.y+dir[i].y;
v.i=1-e.i;
//如果越界或者已经访问就跳过
if(v.x<0||v.x>=n||v.y<0||v.y>=n||vis[v.x][v.y])
continue;
q.push(v);
}
}
}
}
int main()
{
int i=0;
while(scanf("%d %c %c",&n,&a[0],&a[1])!=EOF){
if(i)
printf("\n");
i++;
if(n==1){//如果n=1就输出第一个字符 ,然后跳过此次循环
printf("%c\n",a[0]);
continue;
}
memset(vis,false,sizeof(vis));
bfs(n/2,n/2,0);//从中心点开始bfs
g[0][0]=g[0][n-1]=g[n-1][0]=g[n-1][n-1]=' ';//四个角换成空格
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("%c",g[i][j]);
printf("\n");
}
}
return 0;
}