pku acm 1099

解題報告:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14
1     H       H              
2     |       |              
3 H - O - H - O - H          
4     |       |              
5     H       H              
6     |       |              
7 H - O - H - O - H          
8     |       |              
9     H       H              
10                            
11                            
12                            
                             
                             

首先按如上這種方式進行表格填充,然後根據輸入的矩陣表示來刪除'-'和‘|’字符

#include <iostream>
#include <cstdio>
using namespace std;

int asmx[12][12];
char sice[50][50];

void initSice(int m)
{
	memset((void*)sice,' ',50*50);
	int i,j;
	char ch;
	for (j = 0; j<=4*m+2; ++j)sice[0][j]='*';
	for (j = 0; j<=4*m+2; ++j)sice[4*m+2][j]='*';
	for (i = 0; i<=4*m+2; ++i)sice[i][0]='*';
	for (i = 0; i<=4*m+2; ++i)sice[i][4*m+2]='*';

	for (i=1;i <= 4*m+1; ++i)
	{
		if (i%4 == 1)ch = 'H';
		else if(i%4 == 2 || i%4 == 0)ch = '|';
		else //if(i%4 == 3)
			ch = 'O';

		for (j=3; j<=4*m+1 ; j+=4)		
			sice[i][j] = ch;		
	}

	for (i=3;i <= 4*m+1; i+=4)
	{
		for (j=1; j<=4*m+1 ; ++j)
		{
			if (j%4 == 1)ch = 'H';
			else if (j%4==2 || j%4==0)ch = '-';
			else ch = 'O';

			sice[i][j] = ch;		
		}
	}
}

void decipher(int m)
{
	int i,j,si,sj;
	int dh,dv;

	{//第一行
		i = 1;
		si = 3;
		for (j=1; j<=m; ++j)
		{
			sj = j*4-1;
			if (asmx[i][j])//第一行不可能出現-1
			{
				sice[si-1][sj] = ' ';
				sice[si+1][sj] = ' ';
			}
			else
			{
				sice[si-1][sj] = ' ';
				if (j == 1)
				{				
					sice[si][sj+1] = ' ';
				}
				else
				{
					if (sice[si][sj-3] == '-')				
						sice[si][sj-1] = ' ';				
					else//sice[si][sj-3]==''
						sice[si][sj+1] = ' ';
				}
			}
		}
	}
	

	{//中間行
		for (i=2; i<=m-1; ++i)
		{
			si = i*4-1;
			for (j=1; j<=m; ++j)
			{
				sj = j*4-1;
				if (asmx[i][j] == 0)
				{
					if (j == 1)
					{
						sice[si][sj+1] = ' ';
						if (sice[si-3][sj] == '|')				
							sice[si-1][sj] = ' ';				
						else
							sice[si+1][sj] = ' ';
					}
					else
					{
						if (sice[si-3][sj] == '|')				
							sice[si-1][sj] = ' ';				
						else
							sice[si+1][sj] = ' ';
						
						if (sice[si][sj-3] == '-')				
							sice[si][sj-1] = ' ';				
						else//sice[si][sj-3]==''
							sice[si][sj+1] = ' ';
						
					}
				}
				else if (asmx[i][j] == 1)
				{
					sice[si-1][sj] = ' ';
					sice[si+1][sj] = ' ';
				}
				else// asmx[i][j] == -1
				{
					sice[si][sj-1] = ' ';
					sice[si][sj+1] = ' ';
				}
			}
		}
	}	

	{//最後一行
		i=m;
		si = 4*m-1;
		for (j=1; j<=m; ++j)
		{
			sj = j*4-1;
			if (asmx[i][j])//最後一行不可能出現-1
			{
				sice[si-1][sj] = ' ';
				sice[si+1][sj] = ' ';
			}
			else
			{
				sice[si+1][sj] = ' ';
				if (j == 1)
				{				
					sice[si][sj+1] = ' ';
				}
				else
				{
					if (sice[si][sj-3] == '-')				
						sice[si][sj-1] = ' ';				
					else//sice[si][sj-3]==''
						sice[si][sj+1] = ' ';
				}
			}
		}
	}
}

void p(int m)
{
	int i,j;
	for (j=0; j<=4*m+2 ; ++j)		
		cout<<sice[0][j];
	cout<<endl;

	for (i=3;i <= 4*m-1; ++i)
	{		
		for (j=0; j<=4*m+2 ; ++j)		
			cout<<sice[i][j];
		cout<<endl;
	}

	for (j=0; j<=4*m+2 ; ++j)		
		cout<<sice[4*m+2][j];
	cout<<endl;
	
}

int main()
{
	freopen("in.txt","r",stdin);

	int m;// m <= 11
	int i,j;
	int index = 1;
	while (cin>>m)
	{
		if (m == 0)break;
		for (i = 1; i <= m; ++i)		
			for (j = 1; j <= m; ++j)			
				cin>>asmx[i][j];
		initSice(m);

		cout<<"Case "<<index++<<":"<<endl<<endl;
		decipher(m);
		p(m);		
		cout<<endl;		
	}
}


測試數據

1
1


2
0 1
1 0


4
0 1 0 0
1 -1 0 1
0 0 1 0
0 1 0 0


5
0 1 0 0 0
1 -1 0 1 0
0 1 0 -1 1
0 0 0 1 0
0 0 1 0 0


0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章