每日一题(小白)回溯篇6

由题意得知本题是通过bfs的方法计算最终的字符串,我们可以将接收到的字符转为数字,将所有的字符减去g,循环指定的m天→若是等于0则说明这是草地向上下左右进行扩散为0,若不是草地则不进行操作.最后进行格式化输出(将所有数字输出为0输出g为其它数字输出.)。

①使用数组存储给定元素

②每循环一次终止

③循环m次达到月数限制即可

④根据题目条件设置循环内部结构

⑤按照题目规则输出答案

	static int[][]  grow= {{-1,0},{0,1},{1,0},{0,-1}};
	static int[][]  arr=new int[10000][10000];
	static char[][] c;
	public static void bfs() {
		int n=c.length;
		int m=c[0].length;
		int [][]arr2= new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				arr2[i][j]=arr[i][j];
				//System.out.print(arr[i][j]+" ");测试点
			}
		}
		
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (arr2[i][j]==0) {
						for (int k = 0; k < grow.length; k++) {
						if (i+grow[k][0]>=0 && j+grow[k][1]>=0 && 
								i+grow[k][0]<n && j+grow[k][1]<m) {
							arr[i+grow[k][0]][j+grow[k][1]]=0;
						}
					}
					}
				}
			}

	return;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int x=scan.nextInt();
		int y=scan.nextInt();
		c=new char[x][y];
		scan.nextLine();
		for (int i = 0; i < x; i++) {
			String string=scan.nextLine();
			char[] charArray = string.toCharArray();
			for (int j = 0; j < y; j++) {
				c[i][j]=charArray[j];
				arr[i][j]=c[i][j]-'g';
			}
		}
		int m=scan.nextInt();
		while (m-->0) {
			bfs();
			
		}
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				prints(arr[i][j]);
			}
			System.out.println();
		}
		scan.close();
	}
	public static void prints(int x) {// 打印
			if (x==0) {
				System.out.print("g");
			}else {
				System.out.print(".");
			}
	}

改善了一下,咋们可以仔细研究下上面的代码。下面的有注释👇

	static int[][]  grow= {{-1,0},{0,1},{1,0},{0,-1}};//四个方向
	static int[][]  arr=new int[1000][1000];//结果数组
	static int x,y;
	public static void bfs() {
		int [][]arr2= new int[x][y];//复制原数组
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {
				arr2[i][j]=arr[i][j];//开始复制
				//System.out.print(arr[i][j]+" ");测试点
			}
		}
			for (int i = 0; i < x; i++) {
				for (int j = 0; j < y; j++) {
					if (arr2[i][j]==0) {//判断是不是青草
						for (int k = 0; k < grow.length; k++) {//是青草就得让它四周长起来
						if (i+grow[k][0]>=0 && j+grow[k][1]>=0 && 
								i+grow[k][0]<x && j+grow[k][1]<y) {
							arr[i+grow[k][0]][j+grow[k][1]]=0;//四周长起来
						}
					}
					}
				}
			}
			

	return;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		x=scan.nextInt();//接收数据
		y=scan.nextInt();
		char[][] c = new char[x][y];
		scan.nextLine();
		for (int i = 0; i < x; i++) {//处理数据
			String string=scan.nextLine();
			char[] charArray = string.toCharArray();
			for (int j = 0; j < y; j++) {
				c[i][j]=charArray[j];
				arr[i][j]=c[i][j]-'g';
			}
		}
		int z=scan.nextInt();
		while (z-->0) {//几个月就循环几次
			bfs();//调用长草
		}
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < y; j++) {//按格式输出
				prints(arr[i][j]);
			}
			System.out.println();
		}
		scan.close();
	}
	public static void prints(int x) {// 打印
			if (x==0) {
				System.out.print("g");
			}else {
				System.out.print(".");
			}
	}
输入   ←请记得删除
4 5
.g...
.....
..g..
.....
2
//输出   
gggg.
gggg.
ggggg
.ggg.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值