CCF认证经验

思维步骤:

一、根据题目要求,分析程序输入、输出的格式和关系

二、分析题目给的输入输出样例或自己写一个样例,用自己的思维来思考如何处理这个问题才能得到这样的输入(此过程先不考虑程序代码如何实现,只想着怎样的思路才能解决问题即可)

分析时:题目中对算法要求或描述基本上就是算法的核心,循环或自动的执行算法要求就是解题的算法

三、将思维程序化

  1. 思考输入的数据如何存储(以方便程序中使用这些数据为目的)
  2. 算法核心处一般都为if...else、for等结构的综合使用(将之前自己处理这个问题的思维用代码来代替,即找出需要循环执行的、满足不同的条件有不同的执行等这样类似的模块,用相应的程序结构来实现)
  3. 边界值、临特殊值等单独分析

四、遇到bug,将样例代入程序中,找出不到位的地方,一般都是临界值的问题

五、反复的将样例与程序进行对照,将程序完善

六、检查命名、格式等问题,比如主类名要求命名为Main(很多认证考试都有这样的要求),输出中是否可用换行、空格等。


下面通过例题为分析:

2015年12月 CCF认证第二题

描述:输入一个m行n列的矩阵,要求将横向和纵向3个或3个以上连续相等和数据置0

样例:

输入:

4 5

2 2 2 3 3

2 3 2 2 2

2 5 2 3 3

4 6 6 6 3

输出:

0 0 0 3 3 

0 3 0 0 0 

0 5 0 3 3 

4 0 0 0 3

程序代码:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int m = scan.nextInt();
		int n = scan.nextInt();
		int mark = 1;
		int ArrayIn1[][] = new int[m][n];
		int ArrayIn2[][] = new int[m][n];
		int ArrayOut[][] = new int[m][n];

		for(int i = 0; i < m; i ++){
			for(int j = 0; j < n ; j ++){
				ArrayIn1[i][j] = scan.nextInt();
				ArrayIn2[i][j] = ArrayIn1[i][j];
			}
		}
		
		for(int i = 0; i < m; i ++){
			for(int j = 1; j < n ; j ++){
				if(ArrayIn1[i][j] == ArrayIn1[i][j-1]){
					mark ++;
				}else{
					if(mark >= 3){
						for(int k = j-mark; k < j; k ++){
							ArrayIn1[i][k] = 0;
						}
					}
					mark = 1;
				}
				
				if(j == n - 1){
					if(mark >= 3) for(int k = j-mark+1; k < n; k ++){
						ArrayIn1[i][k] = 0;
					}
					mark = 1;
				}
				
			}
		}
		
		for(int i = 0; i < n; i ++){
			for(int j = 1; j < m ; j ++){
				if(ArrayIn2[j][i] == ArrayIn2[j-1][i]){
					mark ++;
				}else{
					if(mark >= 3){
						for(int k = j-mark; k < j; k ++){
							ArrayIn2[k][i] = 0;
						}
					}
					mark = 1;
				}
				
				if(j == m - 1){
					if(mark >= 3) for(int k = j-mark+1; k < m; k ++){
						ArrayIn2[k][i] = 0;
					}
					mark = 1;
				}
				
			}
		}
		
		for(int i = 0; i < m; i ++){
			for(int j = 0; j < n ; j ++){
				if(ArrayIn1[i][j] == ArrayIn2[i][j]){
					ArrayOut[i][j] = ArrayIn1[i][j];
				}else{
					ArrayOut[i][j] = 0;
				}
			}
		}
		
		for(int i = 0; i < m; i ++){
			for(int j = 0; j < n ; j ++){
				System.out.print(ArrayOut[i][j]+" ");
			}
			System.out.println();
		}
		
	}
}



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值