Problem语句
查克拉夫尤哈是一个车轮状的队形。如图所示,图如下
Chakravyuha有一个非常明确的协调系统。协调系统上的每一个点都由某一部队驻守.总司令总是位于军队的中心,以便更好地协调他的部队。破解查克拉夫尤哈的唯一方法是按顺序顺序击败部队。单位的顺序顺序根据脉轮的半径在结构上不同。半径可以看作是上面描述的矩阵的长度或宽度。结构,即按顺序排列的单元排列如下所示
Chakravyuha的入口点总是在上面矩阵的(0,0)坐标处。这是第一支部队守卫的地方。从(0,0),即第一部队,阿比摩峪必须在(2,2)处向中心前进,在那里,第25,即最后一支敌军部队的卫兵。记住,他必须以顺序的方式摧毁部队。在摧毁了第一个单位之后,阿比摩尤得到了一个能量点。此后,他在摧毁了11倍的部队之后,得到了一个。你也应该能够告诉Yudhisthir Maharaj,Abhimanyu收集他的法力点的地点。Input格式:第一行输入将是陆军单位的长度和宽度,比如N Output格式:
约束:0The逻辑:
#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;
}
}
代码运行良好,可以在艾德龙上进行检查。
发布于 2018-08-01 01:05:00
您应该尽量保持您的main
函数的小和集中。(好吧,你应该尽量保持你写的每一个函数都是小的和集中的!)例如,您可以这样做:
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_matrix
和collect_power_points
是留给读者的练习。
或者,您可能会认为,在物理列表中收集所有功率点坐标没有真正的意义。您已经知道了计算每个功率点的位置的公式!因此,您可以放弃上面的代码并将整个程序重写为:
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
之外,我不需要做任何输入或输出;我只是有一个非常干净的数学问题要解决。
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
成为一个好名字!我们最好写
bool has_power_point(int which_army) {
return (which_army == 1) || (which_army % 11 == 0);
}
然后回到我们的主要功能中,我们可以简单地编写
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);
}
}
https://codereview.stackexchange.com/questions/200690
复制相似问题