A: 序号互换

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <iostream>
#define INF 32768
#define mod 1000000007
#define ll long long
using namespace std;

int Getnum(char s[])
{
    int i, sum=0;

    for(i=0; s[i]; i++)
        sum = sum*10 + s[i]-'0';

    return sum;
}

void Print(int num)
{
    num--;
    if(num<26)
    {
        printf("%c", num+'A');
        return ;
    }

    Print(num/26);

    printf("%c", num%26+'A');
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        char s[110];

        scanf("%s", s);

        if(s[0]>='0' && s[0]<='9')
        {
            int num = Getnum(s);
            Print(num);
            printf("\n");
        }
        else
        {
            int sum=0;

            for(int i=0; s[i]; i++)
                sum = sum*26 + s[i]-'A'+1;

            printf("%d\n", sum);
        }
    }
    return 0;
}
View Code

 

 C: 表达式求值

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
 
using namespace std;
#define met(a,b) (memset(a,b,sizeof(a)))
const int N=550;
#define INF 0x3f3f3f3f
 
char s[N];
 
int Find3(int x) ///找到当前括号匹配的,
{
    int i, sum=0;
 
    for(i=x; s[i]; i++)
    {
        if(s[i]=='(')
            sum ++;
        if(s[i]==',')
        {
            sum --;
            if(sum==0)
                return i;
        }
    }
}
int Find4(int x) ///找到,后的第一个)
{
    int i;
 
    for(i=x; s[i]; i++)
        if(s[i]==')')
        return i-1;
}
 
int Getnum(int L, int R)
{
    int i, sum=0;
 
    for(i=L; i<=R; i++)
        sum = sum*10 + s[i]-'0';
    return sum;
}
 
int Slove(int x)
{
    int L=x+3, Index1, Index2, Lsum, Rsum;
 
    Index1 = Find3(x);
    Index2 = Find4(Index1);
 
    if(s[L+1]>='0' && s[L+1]<='9')
        Lsum = Getnum(L+1, Index1-1);
    else
        Lsum = Slove(L+1);
 
    if(s[Index1+1]>='0' && s[Index1+1]<='9')
        Rsum = Getnum(Index1+1, Index2);
    else
        Rsum = Slove(Index1+1);
 
    if(s[x]=='a')
        return Lsum+Rsum;
    if(s[x+1]=='a')
        return max(Lsum, Rsum);
    if(s[x+1]=='i')
        return min(Lsum, Rsum);
}
 
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int ans;
 
        scanf("%s", s);
 
        ans = Slove(0);
 
        printf("%d\n", ans);
    }
    return 0;
}
 
/**
22
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
add(min(1,1000),max(1,add(100,99)))
*/
 
View Code

 

#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>

using namespace std;

//这个表达式求值,要先算最小单元的数值,可以采用递归方式

char str[350]; //使用全局数据保存字符串
int first;//字符当前位置

int fun()  //函数,分析字符
{
    int v,n;//保存数字及数字的位数
    switch(str[first])  //分析字符串的开头字符
    {
    case 'm':  //有可能是max,min
        first+=3;//指向括号
        if(str[first-2]=='i')//对于min
            return min(fun(),fun());  //如min(3,5),递归时就会分别返回3和5,然后当成min的参数
        else
            return max(fun(),fun());
        break;

    case 'a':  //是add
        first+=3;
        return fun()+fun();  //如add(3,5),递归时就会返回3和5
        break;
    case ',':  //分隔符
    case '(':
    case ')':
        first++;//跳过不处理
        return fun();//继续递归
        break;
    default:  //数字
        sscanf(str+first,"%d%n",&v,&n);//从字符str+first开始将数字读入v,数字位数为n
        first+=n;//走过数字
        return v;
        break;

    }

}

int main()
{
    int n;
    scanf("%d",&n);//n组测试数据
    while(n--)
    {
        scanf("%s",str);//字符数据
        cout<<fun()<<endl;
        first=0;//每次测试完要使first归零
    }

    return 0;
}
/**
1000
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
add(min(1,1000),max(1,add(100,99)))
*/
View Code

 

 

D: 走迷宫

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>

using namespace std;
#define met(a,b) (memset(a,b,sizeof(a)))
const int N=1100;
#define INF 0x3f3f3f3f

int n, flag;
int a[N][N], vis[N][N];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

void DFS(int x, int y, int Min, int Max)
{
    if(x==n && y==n)
    {
        flag = 1;
        return ;
    }
    for(int i=0; i<4; i++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if(nx>=1 && nx<=n && ny>=1 && ny<=n && a[nx][ny]>=Min && a[nx][ny]<=Max && !vis[nx][ny])
        {
             vis[nx][ny] = 1;
             DFS(nx, ny, Min, Max);
        }
        if(flag)
            return ;
    }
}

int Slove(int mid, int Min, int Max)
{
    int i;

    for(i=Min; i<=Max-mid; i++)
    {
        if(a[1][1]<i || a[1][1]>i+mid) continue;
        if(a[n][n]<i || a[n][n]>i+mid) continue;
        flag = 0;
        met(vis, 0);
        vis[1][1] = 1;
        DFS(1, 1, i, i+mid);
        if(flag) return 1;
    }
    return 0;
}


int main()
{
    while(scanf("%d", &n)!=EOF)
    {
        int i, j, Max=-INF, Min=INF;

        for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
        {
            scanf("%d", &a[i][j]);
            Max = max(Max, a[i][j]);
            Min = min(Min, a[i][j]);
        }

        int L=0, R=Max-Min, mid, w, ans=R;
        while(L<=R)
        {
            mid = (L+R)/2;

            w = Slove(mid, Min, Max);
            if(w)
            {
                ans = min(ans, mid);
                R = mid-1;
            }
            else L = mid+1;
        }

        printf("%d\n", ans);
    }
    return 0;
}
View Code

 

posted on 2016-05-30 16:40  栀蓝  阅读(224)  评论(0编辑  收藏  举报

levels of contents