递推水题

import java.util.*;
import java.math.*;

public class Main {

	public static void main(String[] args) {
		int n;
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			n = in.nextInt();
			if (n == 0) {
				break;
			}
			int num0[][] = new int[n + 1][n + 1];//图形从上向下 此列连续的 0 的个数
			int num1[][] = new int[n + 1][n + 1];//图形从上到下 此列所有的 1 的个数
			int a[][] = new int[n + 1][n + 1];
			for (int i = 1; i <= n; ++i) {
				for (int j = 1; j <= n; ++j) {
					a[i][j] = in.nextInt();
				}
			}
			for (int j = 1; j <= n; ++j) {
				num0[0][j] = num1[0][j] = 0;
			}
			for (int i = 1; i <= n; ++i) {
				for (int j = 1; j <= n; ++j) {
					if (a[i][j] == 0) {
						num1[i][j] = num1[i - 1][j];
						num0[i][j] = num0[i - 1][j] + 1;
					} else {
						num1[i][j] = num1[i - 1][j] + 1;
						num0[i][j] = 0;
					}

				}
			}
			int ans = -1;
			for (int i = 1; i <= n; ++i) {
				for (int j = 1; j <= n; ++j) {
					int temp = num0[i][j];
					if (temp > 1 && temp % 2 == 1) {
						if (j + temp / 2 > n || j - temp / 2 < 1) {
							continue;
						}
						// System.out.println(i+" "+j+" "+temp);
						boolean yes = true;
						int pre = temp;
						for (int k = 1; k <= temp / 2; ++k) {
							// System.out.println(pre);
							if (!(num0[i - k][j + k] + 2 == pre && num1[i][j
									+ k]
									- num1[i - temp][j + k] == temp
									- num0[i - k][j + k])) {
								yes = false;
								// System.out.println(k);
								// System.out.println((num0[i-k][j+k])+" "+pre);
							}
							if (!(num0[i - k][j - k] + 2 == pre && num1[i][j
									- k]
									- num1[i - temp][j - k] == temp
									- num0[i - k][j - k])) {
								yes = false;
							}
							pre = pre - 2;
						}
						if (yes == true && temp > ans) {
							ans = temp;
						}

					}
				}
			}
			if (ans == -1) {
				System.out.println("No solution");
			} else {
				System.out.println(ans);
			}

		}
	}

}

 

posted on 2012-09-27 09:23  夜->  阅读(245)  评论(0编辑  收藏  举报