java搜索DFS BFS 剪枝 记忆化搜索相关例题算法学习笔记(持续更新中)

目录

DFS 

P1706 全排列问题

P1596 连接水池的数量

P1036 [NOIP2002 普及组] 选数

P1219 [USACO1.5] 八皇后 Checker Challenge

P2392 kkksc03考前临时抱佛脚

P2036 [COCI2008-2009 #2] PERKET

P1605 迷宫

P1101 单词方阵,以后再做,看别人的题解做的

P2404 自然数的拆分问题,以后在做

BFS 

P1443 马的遍历

P1596 连接水池的数量

P1451 求细胞数量

P1135 奇怪的电梯

P2895 [USACO08FEB] Meteor Shower S(陨石)

P1162 填涂颜色


DFS:

P1706 全排列问题

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        dfs(0);
    }
    static int n;
    static int[]ans=new int[10];
    static int[]vis=new int[10];
    static void print() {
    	for(int i=1;i<=n;i++) {
    		System.out.print("    "+ans[i]);
    	}
    	System.out.println("");
    }
    static void dfs(int x) {
    	if(x==n) {
    		print();
    		return;
    	}
    	for(int i=1;i<=n;i++) {
    		if(vis[i]==0) {
    			vis[i]=1;ans[x+1]=i;
    			dfs(x+1);
        		vis[i]=0;
    		}
    	}
    }
}m

P1596 连接水池的数量

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        for(int i=0;i=0&&xx=0&&yy

P1036 [NOIP2002 普及组] 选数

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        k=in.nextInt();
        for(int i=0;i

P1219 [USACO1.5] 八皇后 Checker Challenge

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        dfs(1);
        System.out.println(ans);
    }
    static int n,ans;
    static int[]a=new int[31];
    static int[]b1=new int[31];
    static int[]b2=new int[31];
    static int[]b3=new int[31];
    static void dfs(int x) {
    	if(x>n) {
    		ans++;
    		if(ans<=3) {
    			for(int i=1;i<=n;i++) {
    				System.out.print(a[i]+" ");
    			}
    			System.out.println();
    		}
        	return;
    	}
    	for(int i=1;i<=n;i++) {
    		if(b1[i]==0&&b2[x+i]==0&&b3[x-i+15]==0) {
    			a[x]=i;
    			b1[i]=1;b2[x+i]=1;b3[x-i+15]=1;
    			dfs(x+1);
    			b1[i]=0;b2[x+i]=0;b3[x-i+15]=0;
    		}
    	}
    }
}

P2392 kkksc03考前临时抱佛脚

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        for(int i=0;i<4;i++) {
        	sub[i]=in.nextInt();
        }
        for(int i=0;i<4;i++) {
        	for(int j=0;j=sub[i]) {
    		min=Math.min(min,Math.max(l,r));
    		return;
    	}
    	l+=times[i][j];
    	dfs(i, j+1);
    	l-=times[i][j];
    	
    	r+=times[i][j];
    	dfs(i, j+1);
    	r-=times[i][j];
    }
}

P2036 [COCI2008-2009 #2] PERKET

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        s=new int[n];
        b=new int[n];
        for(int i=0;i

P1605 迷宫

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        t=in.nextInt();
        sx=in.nextInt();
        sy=in.nextInt();
        fx=in.nextInt();
        fy=in.nextInt();
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
        		arr[i][j]=1;
        	}
        }
        for(int i=1;i<=t;i++) {
        	int x=in.nextInt();
        	int y=in.nextInt();
        	arr[x][y]=0;
        }
        dfs(sx, sy);
        System.out.println(total);
    }
    static int[]dx= {0,0,1,-1};
    static int[]dy= {1,-1,0,0};
    static int n,m,t,sx,sy,fx,fy,ans,total;
    static int[][]arr=new int[10][10];
    static int[][]vis=new int[10][10];
    static void dfs(int x,int y) {
    	if(x==fx&&y==fy) {
    		total++;return;
    	}
    	else {
    		for(int i=0;i<=3;i++) {
    			int xx=x+dx[i],yy=y+dy[i];
    			if(vis[xx][yy]==0&&arr[xx][yy]==1) {
    				vis[x][y]=1;
    				dfs(xx,yy);
    				vis[x][y]=0;
    			}
    		}
    	}
    }
    
}

P1101 单词方阵,以后再做,看别人的题解做的

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        le['y']='i';
    	le['i']='z';
    	le['z']='h';
    	le['h']='o';
    	le['o']='n';
    	le['n']='g';
    	n=in.nextInt();
    	for(int i=1;i<=n;i++) {
    		String s=in.next();
    		for(int j=1;j<=n;j++) {
    			chess[i][j]=s.charAt(j-1);
    		}
    	}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=n;j++) {
    			if(chess[i][j]=='y') {
    				for(int k=0;k<=7;k++) {
    					if(dfs(i, j, 'y', k))
    						ma[i][j]=true;
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++) {
    		for(int j=1;j<=n;j++) {
    			if(ma[i][j])System.out.print(chess[i][j]);
    			else System.out.print("*");
    		}
    		System.out.println();
    	}
    }
    static int n;
    static int[]dx= {1,1,1,-1,-1,-1,0,0};
    static int[]dy= {1,0,-1,1,0,-1,1,-1};
    static char[] le=new char[200];
    static char[][] chess=new char[101][101];
    static boolean[][]ma=new boolean[101][101];
    static boolean dfs(int x,int y,char w,int p) {
    	if(w=='g') {
    		ma[x][y]=true;
    		return true;
    	}
    	int xx=x+dx[p],yy=y+dy[p];
    	if(xx>=1&&yy>=1&&xx<=n&&yy<=n&&chess[xx][yy]==le[w]) {
    		if(dfs(xx, yy, le[w], p)) {
    			ma[x][y]=true;
    			return true;
    		}
    	}
    	return false;
    }
}

P2404 自然数的拆分问题,以后在做

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        dfs(0, 1, 1);
    }
    static int n;
    static int[]a=new int[10];
    static void dfs(int he,int c,int qs) {
    	if(he==n) {
    		for(int i=1;i<=c-2;i++) {
    			System.out.print(a[i]+"+");
    		}
    		System.out.println(a[c-1]);
    		return;
    	}
    	if(he>n)return;
    	for(int i=qs;i<=n-1;i++) {
    		a[c]=i;
    		dfs(he+i, c+1, i);
    		a[c]=0;
    	}
    }
}

P1019 [NOIP2000 提高组] 单词接龙

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        for(int i=0;i<=n;i++) {
        	str[i]=in.next();
        }
        solve(" "+str[n],1);
    	System.out.println(length);
    }
    static String[]str=new String[20];
    static int[]use=new int[20];
    static int length=0,n;
    
    static int f(String s1,String s2) {
    	for(int i=1;i=2)continue;
    		int c=f(strnow, str[i]);
    		if(c>0) {
    			use[i]++;
    			solve(str[i], lengthnow+str[i].length()-c);
    			use[i]--;
    		}
    	}
    }
}

BFS:

P1443 马的遍历

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        x=in.nextInt();
        y=in.nextInt();
        for(int i=1;i<=n;i++) {
        	Arrays.fill(ans[i], -1);
        }
        d dd=new d(x, y);
        q.add(dd);
        ans[x][y]=0;
        while(!q.isEmpty()) {
        	d now=q.poll();
        	for(int i=0;i<8;i++) {
        		int xx=now.x;int yy=now.y;
        		xx+=x1[i];yy+=y1[i];
        		if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&ans[xx][yy]==-1) {
        			ans[xx][yy]=ans[now.x][now.y]+1;
        			q.add(new d(xx, yy));
        		}
        	}
        }
        for(int i=1;i<=n;i++) {
        	for(int j=1;j<=m;j++) {
        		System.out.print(ans[i][j]+" ");
        	}
        	System.out.println();
        }
    }
    static class d{
    	int x,y;
    	public d(int x,int y) {
			this.x=x;this.y=y;
		}
    }
    static Queue q=new LinkedList<>();
    static int n,m,x,y;
    static int[][]ans=new int[401][401];
    static int[]x1= {1,1,2,2,-1,-1,-2,-2};
    static int[]y1= {2,-2,1,-1,2,-2,1,-1};
    
}

P1596 连接水池的数量

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();

        char[][] arr=new char[n][m];
        for(int i=0;iq=new LinkedList<>();
        for(int i=0;i=0&&xx=0&&yy

P1451 求细胞数量

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        in.nextLine();
        char[][]a=new char[n][m];
        for(int i=0;i=0&&yyy>=0&&xxxq=new LinkedList<>();
    static int n,m,ans;
    static int[]x1= {0,0,1,-1};
    static int[]y1= {1,-1,0,0};
}

P1135 奇怪的电梯

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int a=in.nextInt();
        int b=in.nextInt();
        int[]ans=new int[n+1];
        Arrays.fill(ans, -1);
        ans[a]=0;
        int[]arr=new int[n+1];
        for(int i=1;i<=n;i++) {
        	arr[i]=in.nextInt();
        }
        Queueq=new LinkedList<>();
        q.add(a);
        while(!q.isEmpty()) {
        	int now=q.poll();
        	if(now==b)break;
        	int next1=now+arr[now];
        	int next2=now-arr[now];
        	if(next1>=1&&next1<=n&&ans[next1]==-1) {
        		ans[next1]=ans[now]+1;
        		q.add(next1);
        	}
        	if(next2>=1&&next2<=n&&ans[next2]==-1) {
        		ans[next2]=ans[now]+1;
        		q.add(next2);
        	}
        }
        System.out.println(ans[b]);
    }
    
}

P2895 [USACO08FEB] Meteor Shower S(陨石)

最后一个点内存超限了。。。

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int m,sx,sy,st;
        int[][]ma=new int[302][302];
        boolean[][]v=new boolean[302][302];
        int[][]ans=new int[302][302];
        int[]dx= {0,0,0,1,-1};
        int[]dy= {0,1,-1,0,0};
        m=in.nextInt();
        for(int i=0;i<302;i++) {
        	Arrays.fill(ma[i], -1);
        }
        for(int i=1;i<=m;i++) {
        	sx=in.nextInt();
        	sy=in.nextInt();
        	st=in.nextInt();
        	for(int j=0;j<5;j++) {
        		int nx=sx+dx[j];
        		int ny=sy+dy[j];
        		if(nx>=0&&ny>=0&&(ma[nx][ny]==-1||ma[nx][ny]>st)) {
        			ma[nx][ny]=st;
        		}
        	}
        }
        Queueq=new LinkedList<>();
        v[0][0]=true;
        q.add(new int[] {0,0});
        while(!q.isEmpty()) {
        	int[]now=q.poll();
        	int x=now[0];int y=now[1];
        	int s=ans[x][y]+1;
        	if(ma[x][y]==-1) {
        		System.out.println(s-1);
        		return;
        	}
        	for(int i=1;i<=4;i++) {
        		int xx=x+dx[i],yy=y+dy[i];
        		if(xx>=0&&yy>=0&&s < (ma[xx][yy] == -1 ? 99999 : ma[xx][yy]) &&!v[xx][yy]) {
        			q.add(new int[] {xx,yy});
        			v[xx][yy]=true;
        			ans[xx][yy]=s;
        		}
        	}
        }
        System.out.println(-1);
    }
}

P1162 填涂颜色

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        for(int i=0;iq=new LinkedList<>();
        for(int i=0;i=0&&xx=0&&yy

P1825 [USACO11OPEN] Corn Maze S

import java.util.*;
public class Main {
	
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        n=in.nextInt();
        m=in.nextInt();
        for(int i=0;iq=new LinkedList<>();
        			q.add(new int[] {i,j,0});
        			while(!q.isEmpty()) {
        				int[]now=q.poll();
        				int x=now[0];int y=now[1];int t=now[2];
    					if(a[x][y]=='=') {
    						System.out.println(t);return;
    					}
    					if(a[x][y]>='A'&&a[x][y]<='Z') {
    						int[]cs=f(x,y);
    						x=cs[0];y=cs[1];
    					}
        				for(int k=0;k<4;k++) {
        					int xx=x+dx[k];int yy=y+dy[k];
        					if(xx>=0&&xx=0&&yy

 

你可能感兴趣的:(java,学习,笔记)