1835 - I2P(II) 2019_Fall_Chen_hw4 Scoreboard

Time

2019/11/12 18:30:00 2019/11/28 18:30:00

Clarification

# Problem Asker Description Reply Replier Reply Time For all team

# Problem Pass Rate (passed user / total user)
12463 I'm calculator
12494 minimum mean of rectangle sum

12463 - I'm calculator   

Description

"I have a dream that one day I can become a calculator."

~by anonymous Asian

But you are a programmer(you have no life). You can design a program to calculate for you(and become shame of Asian).


The input will contain multiple expression and end by EOF.

Each expression will only contain +, -, *, /, % and numbers(No parentheses).

You need to calculate the answer of the expression.

There may be several blanks or no blanks between operator and number.

You can use the code below and just finish the "Todo" part.

You can write your own code too.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>#define MAX_LENGTH 1000// Token / AST kinds
enum {
    // Non-operators
    Value,
    // Operators
    /// Precedence 1
    Mul, Div, Rem,
    /// Precedence 2
    Add, Sub,
};
typedef struct _TOKEN {
    int kind;
    int param; // Value
    struct _TOKEN *prev, *next;
} Token;
typedef struct _AST {
    int type;
    int val; // Value
    struct _AST *lhs, *rhs;
} AST;
​
// Utility Interface// Used to create a new Token.
Token *new_token(int kind, int param);
// Used to create a new AST node.
AST *new_AST(Token *mid);
// Convert Token linked list into array form.
int list_to_arr(Token **head);
// Use to check if the kind can be determined as a value section.
int isValueSection(int kind);
// Function called when an unexpected expression occurs.
void err();
​
// Used to find a appropriate operator that split the expression half.
int find_Tmid(Token *arr, int l, int r);
//get the Precedence of operator or value
int getOpLevel(int kind);
// calculate the answer 
void getanswer(AST *ast);
​
// Main Functionchar input[MAX_LENGTH];
int regis[1000], now_reg = -1;
​
// Convert the inputted string into multiple tokens.
Token *lexer(char *in);
// Use tokens to build the binary expression tree.
AST *parser(Token *arr, int l, int r);
// calculate the answer
void calculate(AST *ast);
​
int main() {
    while(fgets(input, MAX_LENGTH, stdin) != NULL) {
        // build token list by lexer
        Token *content = lexer(input);
        // convert token list into array
        int length = list_to_arr(&content);
        
        // build abstract syntax tree by parser
        AST *ast_root = parser(content, 0, length-1);
        // calculate the answer
        calculate(ast_root);
        
        /*Todo*/
        // print the answer here.
        
        /*Todo*/
        // do some reset??
    }
    return 0;
}
AST *parser(Token *arr, int l, int r) {
    if(l > r) return NULL;
    // covered in parentheses
    int mid = find_Tmid(arr, l, r);
    AST *newN = new_AST(arr + mid);
    
    if(l == r || newN->type == Value)
        return newN;
​
    /*Todo*/
    //finish the parser
    return newN;
}
AST* new_AST(Token *mid) {
    AST *newN = (AST*)malloc(sizeof(AST));
    newN->lhs = newN->rhs = NULL;
    newN->type = mid->kind;
    newN->val = mid->param;
    return newN;
}
int find_Tmid(Token *arr, int l, int r) {
    /*Todo*/
    //find the node to be contructed
}
int getOpLevel(int kind) {
    /*Todo*/
    // you may use this finction in find_Tmid
}
void calculate(AST *ast) {
    /*Todo*/
    // traverse the tree by postorder
}
​
void getanswer(AST *ast){
    /*Todo*/
    // calculate the answer here.
    // you can calculate the answer by simulating the registers
}
​
Token *lexer(char *in) {
    Token *head = NULL;
    Token **now = &head, *prev = NULL;
    for(int i = 0; in[i]; i++) {
        if(in[i] == ' ' || in[i] == '\n')
            continue;
​
        else if(isdigit(in[i])) {
            int val = 0, oi = i;
            for(; isdigit(in[i]); i++)
                val = val * 10 + (in[i] - '0');
            i--;
            // Detect illegal number inputs such as "01"
            if(oi != i && in[oi] == '0')
                err();
            (*now) = new_token(Value, val);
        }
​
        else {
            switch(in[i]) {
                case '+': // '+'
                    (*now) = new_token(Add, 0);
                    break;
                case '-':
                    (*now) = new_token(Sub, 0);
                    break;
                case '*':
                    (*now) = new_token(Mul, 0);
                    break;
                case '/':
                    (*now) = new_token(Div, 0);
                    break;
                case '%':
                    (*now) = new_token(Rem, 0);
                    break;
                default:
                    err();
            }
        }
        (*now)->prev = prev;
        if(prev != NULL) prev->next = (*now);
        prev = (*now);
        now = &((*now)->next);
    }
    return head;
}
Token *new_token(int kind, int param) {
    Token *res = (Token*)malloc(sizeof(Token));
    res->kind = kind;
    res->param = param;
    res->prev = res->next = NULL;
    return res;
}
int list_to_arr(Token **head) {
    int res = 0;
    Token *now = (*head), *t_head = NULL, *del;
    while(now!=NULL) {
        res++;
        now = now->next;
    }
    now = (*head);
    t_head = (Token*)malloc(sizeof(Token)*res);
    for(int i = 0; i < res; i++) {
        t_head[i] = (*now);
        del = now;
        now = now->next;
        free(del);
    }
    (*head) = t_head;
    return res;
}
int isValueSection(int kind) {
    if(kind == Value) return 1;
    return 0;
}
void err(){
    exit(0);
}
​
 
 
 

 

 

 

 

Input

The input will contain multiple expression and end by EOF.

Each expression will only contain +, -, *, /, % and numbers(No parentheses).

Each expression will not exceed 10000 characters.

We guarantee that every expression is legal.

Output

For each expression print the answer you calculate.

remember to print \n at every end of answer.

Sample Input  Download

Sample Output  Download

Tags




Discuss




12494 - minimum mean of rectangle sum   

Description

You are given a 2D matrix named with all slots are integers.

Each element can be represented as: , while indicate the line number of row and column, respectively.

Now, we define a rectangle sum as follows:

And we define mean of rectangle sum as follows:

You're going to calculate the minimum mean of rectangle sum in a 2D matrix.

That is, you need to find:

while indicate the number or row and column of matrix , respectively.

 

Take sample I/O as example, the matrix should be:

For the minimum choice, you may choose or , while the answer of both of them are .

Input

The first contains 2 integers , indicate the number or row and column of matrix , respectively.

The next lines contain the whole matrix . The -th line contains the -th row of the matrix.

, All elements in will be in range .

Output

The output should contains only the value of minimum mean of rectangle sum.

That is, find out:

and output its value.

Remember the print a '\n' at the end of the output.

Sample Input  Download

Sample Output  Download

Tags




Discuss