注册 登录
编程论坛 C++教室

大家帮忙来看看

a344304180 发布于 2013-01-03 12:13, 388 次点击
fans喜欢玩折纸游戏。整张纸被分成m*m个格子,即构成一个方阵,每个格子里面都写了一个正整数。游戏分两步:首先左右对折,如果对应的格子的数字都相同,那么进行下一步操作;否则停止游戏,此时游戏的结果是"no"。然后上下对折,如果对应的格子的数字相同,那么游戏的结果是“yes”;否则停止游戏,游戏的的结果是"no"。
Input:
第一个数为方阵的个数n,接着就是每个方阵的数据,每个方阵的第一行为该方阵的阶m,后跟m*m个元素。
Output:
如果对应的格子的数字相同,那么游戏的结果是“yes”;否则停止游戏,游戏的的结果是“no”。
Sample Input:
2
3
1 2 1
3 5 3
1 2 1
4
2 1 1 2
1 2 3 4
4 3 2 1
2 1 1 2
Sample Output:
yes
no

本人菜鸟写的程序:
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; ++i)
    {
        int m;
        cin>>m;
        int **a=new int*[m];
        for(int j=0; j<m; j++)
        {
            a[j]=new int[m];
            for(int p=0; p<m; p++)
                cin>>a[j][p];
        }
        int y=0,t=0;
        if(m%2==0)
            y=1;
        for(int x=0; x<=m/2-y; x++)
        {
            for(int q=0; q<=m/2-y; q++)
            {
                if(a[x][q]!=a[x][m-1-q]||a[x][m-1-q]!=a[m-1-x][q]||a[m-1-x][q]!=a[m-1-x][m-1-q])
                {
                    cout<<"no"<<"\n";
                    t=1;
                    break;
                }
            }
            if(t==1)
                break;
        }
        if(t==0)
            cout<<"yes"<<"\n";
    }
    return 0;
}

个人感觉比较繁琐,不知道哪些地方可以优化,尤其循环判断的那一环节。。。

2 回复
#2
rjsp2013-01-04 09:00
算法没问题,只是代码不好看
程序代码:
#include <iostream>
using namespace std;

int main()
{
    size_t n;
    cin >> n;
    for( size_t i=0; i<n; ++i )
    {
        size_t m;
        cin >> m;
        int* a = new int[m*m];
        for( size_t j=0; j<m*m; ++j )
            cin >> a[j];

        bool f = true;
        for( size_t x=0; f && x<m/2; ++x )
        {
            for( size_t y=0; f && y<m/2; ++y )
            {
                if( a[x*m+y]!=a[x*m+(m-1-y)] || a[x*m+y]!=a[(m-1-x)*m+y] || a[x*m+y]!=a[(m-1-x)*m+(m-1-y)] )
                    f = false;
            }
        }

        delete[] a;

        cout << (f?"yes":"no") << endl;
    }

    return 0;
}

#3
mmmmmmmmmmmm2013-01-04 11:18
来学习一下
1