hn 10432 棋盘覆盖

棋盘覆盖问题

Time Limit: 1000ms, Special Time Limit:2500ms,Memory Limit:32768KB

Total submit users: 67, Accepted users: 26

Problem 10432 : No special judgement

Problem description

  在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2L型骨牌不得重叠覆盖。


Input

  输入文件第一行是一个整数T,表示有多少组测试数据,接下来是T组测试数据,共2T行,每组第一行为整数n,2n次幂(1<=n<=64),表示棋盘的大小为n*n,第二行是两个整数,代表特殊方格所在行号和列号。

Output

  先输出“CASE:i,然后按样例输出。数据间用制表符隔开(‘t’),每行最后一个数据后无制表符。

Sample Input

220 082 2

Sample Output

CASE:1

0       1

1       1

CASE:2

3       3       4       4       8       8       9       9

3       2       2       4       8       7       7       9

5       2       0       6       10      10      7       11

5       5       6       6       1       10      11      11

13      13      14      1       1       18      19      19

13      12      14      14      18      18      17      19

15      12      12      16      20      17      17      21

15      15      16      16      20      20      21      21

Judge Tips

  要求遍历顺序按从左到右,从上到下。

 

package acm.icpc;

import java.util.Scanner;
/**
 *  @功能Function Description:    棋盘覆盖
 *  @开发环境Environment:         eclipse
 * 	@技术特点Technique:           
 * 	@算法                         
 *	@版本Version:				  Scanner
 *	@作者Author:                  follow your dreams
 *	@日期Date:                    20120809
 *	@备注Notes: 				  测试数据都对了,可是提交一直wrong error
 *	@链接:                       http://acm.hunnu.edu.cn/online/?action=problem&type=show
 */
public class Icpc10432_1_20120820 {
	
	public static int[][] arr;
	private static int num = 1;//静态变量
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int count = sc.nextInt();
		int countCase = 0;
		while(count-- != 0) {
			countCase ++;
			int n = sc.nextInt(); 
			int x = sc.nextInt();
			int y = sc.nextInt();
			arr = new int[n+1][n+1];
			num = 1;
			if(n==1) {
				System.out.println("0");
			} else {
				solve(1, 1, x+1, y+1, n);
				show(n, countCase);
			}
		}
	}
	
	/**
	 * 将棋盘分割成4个部分
	 * @param i 棋盘的左上角的坐标(i,j)
	 * @param j 
	 * @param x 特殊的那个位置
	 * @param y
	 * @param n 棋盘的宽度(由于棋盘是正方形的,有宽度和左上角的坐标就可以确定棋盘了)
	 */
	public static void solve(int i, int j, int x, int y, int n) {
		int temp = n/2;
		int flag = 0;
		int xtemp1 = i+temp-1;
		int ytemp1 = j+temp-1;
		if(!(x<=xtemp1 && y<=ytemp1)) {
			arr[i+temp-1][j+temp-1] = num;
		} else {
			flag = 1;
		}
		int xtemp2 = i+temp-1;
		int ytemp2 = j+temp;
		if(!(x<=xtemp2 && y>=ytemp2)) {
			arr[xtemp2][ytemp2] = num;
		} else {
			flag = 2;
		}
		int xtemp3 = i+temp;
		int ytemp3 = j+temp-1;
		if(!(x>=xtemp3 && y<=ytemp3)) {
			arr[xtemp3][ytemp3] = num;
		} else {
			flag = 3;
		}
		int xtemp4 = i+temp;
		int ytemp4 = j+temp;
		if(!(x>=xtemp4 && y>=ytemp4)) {
			arr[xtemp4][ytemp4] = num;
		} else {
			flag = 4;
		}
		num ++;	
		if(n/2 != 1) {
			if(flag != 1) {
				solve(i, j, xtemp1, ytemp1, temp);
			} else {
				solve(i, j, x, y, temp);
			}
			if(flag != 2) {
				solve(i, temp+j, xtemp2, ytemp2, temp);
			} else {
				solve(i, temp+j, x, y, temp);
			}
			if(flag != 3) {
				solve(temp+i, j, xtemp3, ytemp3, temp);
			} else {
				solve(temp+i, j, x, y, temp);
			}
			if(flag != 4) {
				solve(temp+i, temp+j, xtemp4, ytemp4, temp);
			} else {
				solve(temp+i, temp+j, x, y, temp);
			}
		}
	}
	
	public static void show(int n, int countCase) {//输出
		int i, j;
		System.out.println("CASE:" + countCase);
		for(i=1; i<=n; i++) {
			for(j=1; j<n; j++) {
				System.out.printf("%d\t", arr[i][j]);
			}
			System.out.println(arr[i][j]);
		}
	}

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值