【思特齐杯.云上蓝桥-算法集训营】第二周

【思特齐杯.云上蓝桥-算法集训营】第二周,第1张

【思特齐杯.云上蓝桥-算法集训营】第二周 1. 带分数 import java.util.Scanner;
 
public class 带分数 {
 
    
    public static void main(String[] args) {
 
        Scanner scanner=new Scanner(System.in);
        int n=Integer.parseInt(scanner.nextLine());
        long t1=System.currentTimeMillis();
        String[] arr=new String[]{"1","2","3","4","5","6","7","8","9"};
 
        int t=0;
        int conut=0;
        String string="";
        for (int i = 1; i < n; i++) {
            for (int j = 2; j < 10000; j++) {
                
                t=(n-i)*j;
                string=""+i+j+t;
                if(string.length()!=9){
                    continue;                    
                }else {
                    boolean fa=false;
                    
                    for (int k = 0; k < arr.length; k++) {
                        int index=string.indexOf(arr[k]);
                        if(index==-1){
                            fa=false;
                            break;
                        }
                        fa=true;
                    }
                    if(fa){
                        conut++;
                    }
                }
            }
        }
    System.out.println(conut);
    long t2=System.currentTimeMillis();
    System.out.println(t2-t1);
    }
} 2. 李白打酒

#include
int num = 0;
void f(int flower,int store,int sum) //flower记录遇到花的次数,store记录遇到店的次数,
                                     // sum为当前酒的总数 
{
    if(flower>9 || store>5)   // 判断递归的出口对于递归来说十分关键 
        return;
    if(flower==9 && store==5)   //由题意最后一次肯定为花,因此在倒数第二次时的情况为
                                //经过9次花,5次店,并且剩下了一斗酒sum=1   
    {
        if(sum==1)
        {
            num++;
            return;
        }
        else
            return;
    }
    f(flower+1,store,sum-1);   //遇花喝一斗,即sum-1 
    f(flower,store+1,sum*2);   //遇店多一倍,即sum*2 
}

int main ()
{
    f(0,0,2);  //初次递归的初始条件 
    printf("%d",num);
    return 0;
}
3. 第 39 级台阶

51167078 

4. 穿越雷区 #include
using namespace std;
const int N=110;
 
char a[N][N];
int book[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
 
 
struct node{
    int x;
    int y;
    char c;
    int step;
}first;
 
int n;
 
int bfs(node first)
{
    queueq;
    q.push(first);
    while(!q.empty())
    {
        node now=q.front();
        if(now.c=='B')
        {
            return now.step;
        }
        q.pop();
        for(int i=0;i<4;i++)
        {
            int nx=now.x+dx[i];
            int ny=now.y+dy[i];
            if(nx>=0&&nx=0&&ny             {
                book[nx][ny]=1;
                node next;
                next.x=nx;
                next.y=ny;
                next.c=a[nx][ny];
                next.step=now.step+1;
                q.push(next);
            }
        }
    }
    return -1;
    
}
 
 
int main()
{
    cin>>n;
    for(int i=0;i     {
        for(int j=0;j         {
            cin>>a[i][j];
            if(a[i][j]=='A')
            {
                first.x=i;
                first.y=j;
                first.c='A';
                first.step=0;
            }
        }
    }
    cout<     
    
    
    return 0;
} 5. 迷宫 DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
6. 跳马 #include
int n , m ,ans ;
int dx[4] = {1,2,2,1} ;
int dy[4] = {2,1,-1,-2} ;
void dfs(int x ,int y)
{
    if(x == m && y == n)
    {
        ans ++ ;
    }
    int i ;
    int tx = 0 ;
    int ty = 0 ;
    for (i = 0 ; i< 4 ;i++)
    {
        tx = x + dx[i] ;
        ty = y + dy[i] ;
        if(tx >m  || tx <0 || ty >n || ty<0)
        continue ;
        else
        {
            dfs(tx,ty);
        }
 
    }
    
}
int main()
{
    scanf("%d%d",&n,&m);
    dfs(0,0);
    printf("%d",ans);
    
    return 0 ;
} 7. 路径之谜

package Lqb;

public class Text5 {

    static String lx="";        //路线
    final static int N=4;        //方格大小
    public static void main(String[] args) {
        int[] top={2,4,3,4};    //上靶
        int[] left={4,3,3,3};    //左靶
        int[][] from=new int[N][N];    //方格
        
        String[] strArray={""};    //记录路线i,j坐标
        //初始化二维数组
        int num=0;
        for(int i=0;i             for(int j=0;j                 from[i][j]=num++;
            }
        }
        //
        permute(from,0,0,strArray);
    }
    public static void permute(int[][] from,int X,int Y,String[] strArray) {
        if(X==N-1&&Y==N-1){
            System.out.print(lx);
            
        }
        for(int i=X;i             for(int j=Y;j                 lx=lx+from[i][j];
                swap(from,i,j,strArray);
            }
        }
    }
    //分叉可能路线
    public static void swap(int[][] from,int X,int Y,String[] strArray) {
        if(ifss(X--,Y,strArray)){
            permute(from,X,Y,strArray);
            X++;
        }
        if(ifss(X++,Y,strArray)){
            permute(from,X,Y,strArray);
            X--;
        }
        if(ifss(X,Y--,strArray)){
            permute(from,X,Y,strArray);
            Y++;
        }
        if(ifss(X,Y++,strArray)){
            permute(from,X,Y,strArray);
            Y--;
        }
        if(ifss(X--,Y--,strArray)){
            permute(from,X,Y,strArray);
            X++;
            Y++;
        }
        if(ifss(X--,Y++,strArray)){
            permute(from,X,Y,strArray);
            X++;
            Y--;
        }
        if(ifss(X++,Y++,strArray)){
            permute(from,X,Y,strArray);
            X--;
            Y--;
        }
        if(ifss(X++,Y--,strArray)){
            permute(from,X,Y,strArray);
            X--;
            Y++;
        }
    }
    //判断路线是否走过
    public static boolean ifss(int X,int Y,String[] strArray) {
        for(int i=0;i             if(strArray[i].equalsIgnoreCase(X+""+Y)){
                return false;
            }
        }
        return true;
    }
    
}

8. 未名湖边的烦恼 #include
int fun(int n,int m)
{
    if(n     if(m==0) return 1;
    return fun(n-1,m)+fun(n,m-1); 
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    printf("%dn",fun(n,m));
    return 0;
}
  9. 大臣的旅费

#include
#include  
#include
#include
#include
#include
#include
#include
using namespace std; 
struct node{
    int v;
    int w;
    node(int a,int b){v=a;w=b;}
};

const int maxn=200000;
vector g[maxn];
bool vis[maxn]={false};
int n,p,q,d;
int ans,to;//距离(千米数),to为任意点能到的最远点

void dfs(int now,int dis)
{
    if(dis > ans) //找到更远的距离,更新ans,更新to
    {
        ans=dis;
        to=now;
    }
    
    for(int i=0;i     {
        int v=g[now][i].v;
        int w=g[now][i].w;
        if(vis[v]==false)  //没访问过,就去访问
        {
            vis[v]=1;    //标记走过
            dfs(v,dis+w); //更新dis的距离
            vis[v]=0;  //回溯
        }
    }
}


int main()
{
   
   cin>>n;
   for(int i=0;i    {
          cin>>p>>q>>d;
          g[p].push_back(node(q,d)); //无向图
          g[q].push_back(node(p,d));
   }
   
   vis[1]=1;   //从1(首都)出发,可以任意一点
   dfs(1,0);   //dfs入口
   
   memset(vis,0,sizeof(vis)); 
   ans=0;
   
   vis[to]=1;  //从to出发
   dfs(to,0);
   
   cout<  
    return 0;     
}

10. 2n 皇后问题

#include
#include
using namespace std;
const int NUM = 51;
int pos[NUM][NUM]; // 可以防止皇后的位置
int x[NUM]; // 黑皇后的位置
int y[NUM]; // 白皇后的位置
int n;
int num = 0;
void Print() // 展示用处,上交时删掉
{
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            if (pos[i][j] == 1)
            {
                if (x[i] == j)
                {
                    cout << "B ";
                }
                else if (y[i] == j)
                {
                    cout << "W ";
                }
                else
                {
                    cout << "X ";
                }
            }
            else
            {
                cout << "0 ";
            }
        }
        cout << endl;
    }
    for (int i = 1; i <= n; ++i)
    {
        cout << "- ";
    }
    cout << endl;
}
void Queen_2n(int r) // 表示递归到第r行
{
    if (r == n + 1)
    {
        Print();
        num++;
        return;
    }
    for (int i = 1; i <= n; ++i) // 循环遍历,在第r行时皇后的位置
    {
        for (int j = 1; j <= n; ++j)
        {
            if (pos[r][i] == 1 && pos[r][j] == 1 && i != j) // 表示此位置可以安排皇后
            {
                bool flag = true;
                x[r] = i;
                y[r] = j;
                for (int k = 1; k < r; ++k) // 遍历之前行,判断该位置是否可行
                {
                    if (x[r] == x[k] || abs(k - r) == abs(x[k] - x[r]) || y[r] == y[k] || abs(k - r) == abs(y[k] - y[r]))
                    {
                        flag = false; // 不能同列,同对角线
                        break;
                    }
                }
                if (flag) // 如果皇后位置错误,不递归下一次
                {
                    Queen_2n(r + 1); // 如果位置可以,找下一行
                }
            }
        }
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            cin >> pos[i][j];
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        cout << "- ";
    }
    cout << endl;
    Queen_2n(1);
    cout << num << endl;
    return 0;
}
 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5703741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存