ZOJ 2423

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1423


预处理,动态规划的思想,处理的时候要把每一行的空格补全(处理成一个矩形),在处理的时候才方便,最后去掉多余的空格。

但是在字符串处理的时候错了很多次,string 好像不能直接对末尾的那个字符串进行这样的赋值 str[i][j]='\0';。


下面是AC代码:

#include<iostream>
#include<string>
#include<cmath>
using namespace std;

string str[8][1000];
int main(){
	
	int n,i,j,k;
	str[1][0]="X";
	int len;
	for(i=2;i<=7;i++){
		len=pow(3,i-2);
		for(j=0;j<len;j++){
			str[i][j]=str[i-1][j];
		}
		for(j=0;j<len;j++){
			for(k=0;k<str[i-1][0].size();k++)
			str[i][j]+=" ";
		}
		for(j=0;j<len;j++){
			str[i][j]+=str[i-1][j];
		}

		for(j=len;j<2*len;j++){
			for(k=0;k<str[i-1][0].size();k++)
			str[i][j]+=" ";
		}
		for(j=len;j<2*len;j++){
			str[i][j]+=str[i-1][j-len];
		}
		for(j=len;j<2*len;j++){
			for(k=0;k<str[i-1][0].size();k++)
			str[i][j]+=" ";
		}


		for(j=2*len;j<3*len;j++){
			str[i][j]=str[i-1][j-2*len];
		}
		for(j=2*len;j<3*len;j++){
			for(k=0;k<str[i-1][0].size();k++)
			str[i][j]+=" ";
		}
		for(j=2*len;j<3*len;j++){
			str[i][j]+=str[i-1][j-2*len];
		}

    

	}
	
	
	//for()

	 for (i=1; i<=7; i++)  
        for ( j=0, k; j<pow(3,i-1); j++)  
        {  
            string tmp=str[i][j];  
            for (k=tmp.length()-1; k>=0; k--)  
                if (tmp[k]!=' ') break;  
			str[i][j]=str[i][j].substr(0,k+1);
          //  str[i][j].assign(tmp, 0, k+1);       //这个地方错了无数次啊。左边那两种方法都可以,但是为什么不可以写成:str[i][j+1]='\0'呢;
        }                                          //估计是sting是对象,不能直接对对象操作??


	
	while(cin>>n&&n>=0){
		if(n==0)
			cout<<"-"<<endl;
		else{
		for(i=0;i<pow(3,n-1);i++)
			cout<<str[n][i]<<endl;
		cout<<"-"<<endl;
		}
	}
	return 0;
	
	
}


你可能感兴趣的:(String,stdstring)