1 solutions

  • 0
    @ 2022-11-27 22:11:18

    p7351.数字回旋三角回旋镖

    首先,这道题肯定是利用二维数组打表制作,要知道对应n所需要多少个数字

    方法一:

    可以用递推的方式获得相应n长度回旋镖需要多少个数字

    1 2 3 4 5 6 7
    1 3 6 10 15 21 28

    可以很容易得到,s(i)=s(i-1)+i

    image

    方法二:

    ​ 对不同长度回旋镖图的观察,可以得到s(n)=(n+1)*n /2

    我们可以把过程分开

    image

    很容易发现这是三个类似的三角形环(边长分别为7,4,1)组成,那么我们就可以利用递归(循环)解决。

    通过观察可以发现,第一个三角环的起始地址为(1,1),第二个三角环地址为(2,3),第三个为(3,5),那么设第i个三角环的起始地址为(x,y),所以第(i+1)个的地址就位(x+1,y+2)。

    每次三角环的边长都会减少3,所以当边长小于或者等于0时,此时便可以结束。

    此为核心代码:

    void cz(int x,int y,int flag,int gcc)
    {
    	int i,j;
    	for(i=y;i<n-gcc&&temp!=mx+1;i++)k[x][i]=temp++;
    	for(j=x;j<=n-gcc*2&&temp!=mx+1;j++)k[j][i]=temp++;
    	for(i--,j-=2;k[j][i]==0&&temp!=mx+1;i--,j--)k[j][i]=temp++;
    	if(flag<=0)return;
    	cz(x+1,y+2,flag-3,gcc+1);
    }
    //flag 为当前三角环的边长
    //x,y为当前三角环的起始地址
    //gcc为当前是第gcc个三角环(从0开始)
    //temp为相应打表数字,全局变量,从1开始
    

    我们可以比较容易的利用gcc(第gcc个三角环)来计算出当前三角环的x,y的上限

    即,y<n-gcc, x<n-gcc*2

    注意输出按照%4d的格式输出

    以下为完整代码,可能不是最佳,仅供参考

    #include <bits/stdc++.h>
    using namespace std;
    int n,temp=1,mx;
    int k[51][51];
    void out()//输出代码
    {
    	for(int i=1;i<=n;i++)
        {
    		for(int j=1;j<=n;j++)
    		{
    			if(k[i][j]!=0)printf("%4d",k[i][j]);
    			else printf("%4d",0);
    		}
    		cout<<endl;
    	}
    }
    void cz(int x,int y,int flag,int gcc)//核心打表代码
    {
    	int i,j;
    	for(i=y;i<n-gcc&&temp!=mx+1;i++)k[x][i]=temp++;
    	for(j=x;j<=n-gcc*2&&temp!=mx+1;j++)k[j][i]=temp++;
    	for(i--,j-=2;k[j][i]==0&&temp!=mx+1;i--,j--)k[j][i]=temp++;
    	if(flag<=0)return;
    	cz(x+1,y+2,flag-3,gcc+1);
    }
    int main(){
    	
        cin>>n;
        memset(k,0,sizeof(k));//二维数组置零
    	mx=(n+1)*n/2;//计算一共要用的数字
        cz(1,1,n,0);
    	out();
        return 0;
    }
    

    Information

    ID
    6663
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    # Submissions
    63
    Accepted
    13
    Uploaded By