做题模板小结

4 篇文章 0 订阅

深度搜索

#include <iostream>
#include <vector>
using namespace std;
int n=3,m=3;//搜索地域的大小(一般题目)会给出
vector< vector<char> > map(n,vector<char>(m));//搜索的地方
vector< vector<bool> > visi(n,vector<bool>(m));//搜索的标记
int dir[4][2]{{-1,0},{0,-1},{1,0},{0,1}};//搜索的方向(由题目而定)


bool in(int x,int y)
{
    return 0<=x&&x<n&&0<=y&&y<m;
}

void DFS(int x,int y)//x,y为搜起点坐标
{
    //搜索结束判定
     if (map[x][y]=='T')
     {
        return;
     }
     visi[x][y]=true;//已搜索的标记

      for (int i=0;i<4;i++ )//搜索给定方向的位置
      {
         int dx=x+dir[i][0];
         int dy=y+dir[i][1];

          if (in(dx,dy))//如果在搜索地域
          {
               if (map[dx][dy]!='|'&&!visi[dx][dy])//如果满足搜索继续搜索的条件
               {
                  DFS(dx,dy);//继续搜索
               }
          }

      }
      visi[x][y]=false;//视情况是否需要回溯
}

广度搜索

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int m=4,n=3;
typedef pair<int,int> Position;
vector< vector<Position> > father(m,vector<Position>(n));//记录每个坐标的父节点
vector< vector<int> > Map(m,vector<int>(n));
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
bool in(int x,int y)
{
    return 0<=x&&x<m&&0<=y&&y<n;
}
void Print_Path()//打印路径
{
    int x=0,y=0;
     while (x!=-2&&y!=-2)
     {
        cout<<x<<","<<y<<"\n";
         int tem=x;
         x=father[x][y].first;
         y=father[tem][y].second;
     }
}
void BFS()
{
    queue<Position> q;
    q.push(Position(m-1,n-1));
    Map[m-1][n-1]=2;
    father[m-1][n-1]=Position(-2,-2);
     while (!q.empty())
     {
        Position tem=q.front();
        q.pop();
         for (int i=0;i<4;i++ )
         {
            Position  now;
            now.first=tem.first+dir[i][0];
            now.second=tem.second+dir[i][1];
            if(in(now.first,now.second))
            {
                  if(Map[now.first][now.second]==-1)//如果到达起始位置,则说明存在最路径
                  {
                    father[now.first][now.second]=tem;
                    Print_Path();
                    return;
                  }
                  if(Map[now.first][now.second]==0)
                  {
                      father[now.first][now.second]=tem;
                      Map[now.first][now.second]=2;
                      q.push(now);
                  }
             }
         }
     }
}

二叉排序模板

#include <iostream>
using namespace std;
 class Node
{
public:
    int data;
    Node* left;
    Node* right;
    Node(int value)
    {
        left=NULL;
        right=NULL;
        data=value;
    }
};

void CreatTree(Node* root, int* data, int index, int len, Node* start)
{
	if (index > (len - 1))
	{
		return;
	}
	Node*  newNode = new Node(data[index]);
	if (data[index] > root->data)
	{
		if (root->right == NULL)
		{
			root->right = newNode;
			index++;
			CreatTree(start, data, index, len, start);
		}
		else
		{
			CreatTree(root->right, data, index, len, start);
		}


	}
	else
	{
		if (root->left == NULL)
		{
			root->left = newNode;
			index++;
			CreatTree(start, data, index, len, start);
		}
		else
		{
			CreatTree(root->left, data, index, len, start);
		}

	}
}

void ZhongPrint(Node* root)
{
	if (root == NULL)
	{
		return;
	}
	ZhongPrint(root->left);
	cout << root->data;
	ZhongPrint(root->right);
}

int main()
{
    int n;
    cin>>n;

     int* nums=new int[n];
     for(int i=0;i<n;i++ )
     {
        cin>>nums[i];
     }
    Node* root=new Node(nums[0]);
    CreatTree(root,nums,1,n,root);
    ZhongPrint(root);
    return 0;
}

二分

int Dichodomy(int* nums,int start,int end,int target)
{
      if (end-start==1)
      {
          if (nums[end]==target)
          {
             return end;
          }
          else
          {
              return start;
          }
      }
     int left=start;
     int right=end;
     int mid=(start+end)/2;

     if (nums[mid]<target)//nums[mid]<target 的判断视具体题目情况而定,在某些题目中可能是一个复杂的判端
     {
          Dichodomy(nums,mid,end,target);
     }
     else if(nums[mid]>target)
     {
          Dichodomy(nums,start,mid,target);
     }
     else
     {
         return mid;
     }

}

树状数组模板

#include <iostream>
#include <vector>
using namespace std;
int maxindexx=1000010;
vector<int> nums(maxindexx);
int lowebit(int x)
{
   return x&(-x);
}
void add(int index,int addvalue)
{
     for (int i=index;i<maxindexx;i+=lowebit(i))
     {
        nums[i]+=addvalue;
     }
}

int quene(int r)
{
    int res=0;
     for (int i=r;i>0;i-=lowebit(i))
     {
       res+=nums[i];
     }
     return res;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是蓝桥杯Java组做题模板,供参考: 1. 输入输出模板 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读入一个整数 int n = scanner.nextInt(); // 读入一个字符串 String s = scanner.next(); // 输出结果 System.out.println(n + " " + s); scanner.close(); } } ``` 2. 数组模板 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 定义数组 int[] a = new int[n]; // 读入数组 for (int i = 0; i < n; i++) { a[i] = scanner.nextInt(); } // 输出数组 for (int i = 0; i < n; i++) { System.out.print(a[i] + " "); } scanner.close(); } } ``` 3. 字符串模板 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); // 字符串长度 int len = s.length(); // 字符串转字符数组 char[] ch = s.toCharArray(); // 输出字符串和字符数组 System.out.println(s); for (int i = 0; i < len; i++) { System.out.print(ch[i]); } scanner.close(); } } ``` 4. 递归模板 ```java public class Main { public static void main(String[] args) { // 调用递归函数 int result = recursion(10); System.out.println(result); } // 定义递归函数 public static int recursion(int n) { if (n == 1) { return 1; } return n * recursion(n - 1); } } ``` 5. 动态规划模板 ```java public class Main { public static void main(String[] args) { int n = 5; int[] a = {2, 3, 1, 5, 4}; // 定义状态数组 int[] dp = new int[n]; // 初始化状态 dp[0] = a[0]; // 状态转移方程 for (int i = 1; i < n; i++) { dp[i] = Math.max(dp[i - 1], 0) + a[i]; } // 输出最终结果 int result = Integer.MIN_VALUE; for (int i = 0; i < n; i++) { result = Math.max(result, dp[i]); } System.out.println(result); } } ``` 以上是蓝桥杯Java组做题模板,希望能对大家有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值