首页 > ACM题库 > HDU-杭电 > hdu 2074 叠筐[解题报告]C++
2013
12-29

hdu 2074 叠筐[解题报告]C++

叠筐

问题描述 :

需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

输入:

输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;

输出:

输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;

样例输入:

11 B A
5 @ W

样例输出:

 AAAAAAAAA 
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
 AAAAAAAAA 

 @@@ 
@WWW@
@[email protected]@
@WWW@
 @@@ 

http://acm.hdu.edu.cn/showproblem.php?pid=2074

这。是个画圈的水题。

#include <iostream>
using namespace std;
#define N 85
char matrix[N][N];

int main(){
#ifndef ONLINE_JUDGE
	freopen("Iin.txt","r",stdin);
#endif
	int n,ce=0,i,j,k,quan;
	char b,a,c;
	while (scanf("%d %c %c",&n,&b,&a)!=EOF){
		ce++;
		quan=0;
		memset(matrix,0,sizeof(matrix));
		for (k=(n+1)/2-1;k>=0;k--){
			if (quan%2==0)
				c=b;
			else c=a;
			quan++;
			for (i=k,j=i;j<n-i;j++){ //画横的。
				matrix[i][j]=c;
				matrix[n-i-1][j]=c;
			}
			for (i=k,j=i;j<n-i;j++){ //画竖的。
				matrix[j][i]=c;
				matrix[j][n-i-1]=c;
			}
		}
		matrix[0][n-1]=matrix[0][0]=' ';
		matrix[n-1][0]=matrix[n-1][n-1]=' ';
		if (ce!=1)
			putchar(10);
		if (n==1){
			printf("%c\n",b);
			continue;
		}
		for (i=0;i<n;i++){
			for (j=0;j<n;j++)
				printf("%c",matrix[i][j]);
			putchar(10);
		}
	}
	return 0;
}

解题转自:http://blog.csdn.net/operator456/article/details/8548640


  1. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?