首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >代码Vita: Chakravyuha

代码Vita: Chakravyuha
EN

Code Review用户
提问于 2018-07-31 19:35:48
回答 1查看 4.8K关注 0票数 5

Problem语句

查克拉夫尤哈是一个车轮状的队形。如图所示,图如下

Chakravyuha有一个非常明确的协调系统。协调系统上的每一个点都由某一部队驻守.总司令总是位于军队的中心,以便更好地协调他的部队。破解查克拉夫尤哈的唯一方法是按顺序顺序击败部队。单位的顺序顺序根据脉轮的半径在结构上不同。半径可以看作是上面描述的矩阵的长度或宽度。结构,即按顺序排列的单元排列如下所示

Chakravyuha的入口点总是在上面矩阵的(0,0)坐标处。这是第一支部队守卫的地方。从(0,0),即第一部队,阿比摩峪必须在(2,2)处向中心前进,在那里,第25,即最后一支敌军部队的卫兵。记住,他必须以顺序的方式摧毁部队。在摧毁了第一个单位之后,阿比摩尤得到了一个能量点。此后,他在摧毁了11倍的部队之后,得到了一个。你也应该能够告诉Yudhisthir Maharaj,Abhimanyu收集他的法力点的地点。Input格式:第一行输入将是陆军单位的长度和宽度,比如N Output格式:

  • 打印NxN矩阵,以(\t)选项卡字符分隔单位编号
  • 打印收集的总功率点
  • 按顺序采集的功率点的打印坐标(每一行一个)
  • 按顺序采集的功率点的打印坐标(每一行一个)

约束:0The逻辑:

代码语言:javascript
运行
复制
#include

int isDiv(int);

int main(){

    int n;
    scanf("%d",&n);

    //check contraint
    if(n<=0 || n>100){
        return 0;
    }

    int a[100][100]; // main matrix

    int counter=1; // keeps track of number

    int i,j; //keeps track of position

    int w;   // w - window 

    int size=n-1; // size - size of segment of window

    for( w = 0 ; w < n / 2 ; w++){
        i = w;
        j = w;

        //go right
        for( j = j ; j < size + w ; j++){
            a[ i ][ j ] = counter;
            counter++;
        }

        //go down
        for( i = i ; i < size + w ; i++){
            a[ i ][ j ] = counter;
            counter++;
        }

        //go left
        for( j = j ; j > w ; j--){
            a[ i ][ j ] = counter;
            counter++;
        }

        //go up
        for( i = i ; i > w ; i--){
            a[ i ][ j ] = counter;
            counter++;
        }
        size = size-2;
    }
    if( n % 2 != 0){
        a[ w ][ w ] = counter;      
    }

    //print matrix
    for( i = 0 ; i < n ; i++){
        for( j = 0 ; j < n ; j++){
            printf("%d\t", a[ i ][ j ]);
        }
        printf("\n");
    }

    int no_div = (n*n)/11 + 1 ; // no of divisibles

    printf("Total Power points : %d\n",no_div);

    printf("(0,0)\n");

    size=n-1;

    //print positions
    for( w = 0 ; w < n / 2 ; w++){
        i = w;
        j = w;

        //go right
        for( j = j ; j < size + w ; j++){
            if(isDiv( a[ i ][ j ] )){
                printf("(%d,%d)\n", i, j);
            }
        }

        //go down
        for( i = i ; i < size + w ; i++){
            if(isDiv( a[ i ][ j ] )){
                printf("(%d,%d)\n", i, j);
            }
        }

        //go left
        for( j = j ; j > w ; j--){
            if(isDiv( a[ i ][ j ] )){
                printf("(%d,%d)\n", i, j);
            }
        }

        //go up
        for( i = i ; i > w ; i--){
            if(isDiv( a[ i ][ j ] )){
                printf("(%d,%d)\n", i, j);
            }
        }
        size = size-2;
    }
    if( n % 2 != 0){
        if(isDiv( a[ i ][ j ] )){
            printf("(%d,%d)\n", i, j);
        }       
    }

    return 0;
}

int isDiv(int x){
    if( x % 11 == 0 ){
        return 1;
    }
    else{
        return 0;
    }
}

代码运行良好,可以在艾德龙上进行检查。

EN

回答 1

Code Review用户

回答已采纳

发布于 2018-08-01 01:05:00

您应该尽量保持您的main函数的小和集中。(好吧,你应该尽量保持你写的每一个函数都是小的和集中的!)例如,您可以这样做:

代码语言:javascript
运行
复制
struct Coord {
    int row, col;
};
struct CoordList {
    int size;
    Coord *data;
};

void print_coords(Coord c, FILE *out) {
    printf("(%d,%d)\n", c.row, c.col);
}

int main() {
    int n;
    scanf("%d", &n);
    print_tab_delimited_matrix(n, stdout);
    CoordList coords = collect_power_points(n);
    printf("%d\n", coords.size);
    for (int i=0; i < coords.size; ++i) {
        print_coords(coords.data[i]);
    }
}

编写小函数print_tab_delimited_matrixcollect_power_points是留给读者的练习。

或者,您可能会认为,在物理列表中收集所有功率点坐标没有真正的意义。您已经知道了计算每个功率点的位置的公式!因此,您可以放弃上面的代码并将整个程序重写为:

代码语言:javascript
运行
复制
int main() {
    int n;
    scanf("%d", &n);
    print_tab_delimited_matrix(n, stdout);
    int n2 = n * n;
    printf("%d\n", 1 + (n2 / 11));
    print_coords(get_coords_of_army(1, n), stdout);
    for (int i = 11; i <= n2; i += 11) {
        print_coords(get_coords_of_army(i, n), stdout);
    }
}

编写函数get_coords_of_army是留给读者的练习。但重要的是要认识到,写这个功能应该是一个挑战!你应该发展本能和直觉,迅速把问题陈述分解成子问题,然后解决这些子问题。注意,在main之外,我不需要做任何输入或输出;我只是有一个非常干净的数学问题要解决。

代码语言:javascript
运行
复制
Coord get_coords_of_army(int which_army, int breadth_of_square);

这个问题陈述中的其他所有事情基本上都是一种“红鲱鱼”。

我顺便指出,对于一个计算x是否可以被11整除的函数来说,D9不是一个好名字。命名它的is...-something可以得到分数,但是肯定(A) is_divisible_by_11会是一个更好的名称,(B)您实际上不需要为此设置一个函数!

您可以认为这是对代码的未来验证:如果下一次拼图迭代改变了电源点的位置,该怎么办?这是公平的,而且使is_divisible_by_11成为一个坏名声.但这并不能使isDiv成为一个好名字!我们最好写

代码语言:javascript
运行
复制
bool has_power_point(int which_army) {
    return (which_army == 1) || (which_army % 11 == 0);
}

然后回到我们的主要功能中,我们可以简单地编写

代码语言:javascript
运行
复制
    printf("%d\n", 1 + (n2 / 11));
    for (int i = 1; i <= n2; ++i) {
        if (has_power_point(i)) {
            print_coords(get_coords_of_army(i, n), stdout);
        }
    }
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/200690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档