棋盘覆盖问题
2015-01-05 16:04
309 查看
棋盘覆盖问题 |
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB |
Total submit users: 103, Accepted users: 40 |
Problem 10432 : No special judgement |
Problem description |
在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 |
Input |
输入文件第一行是一个整数T,表示有多少组测试数据,接下来是T组测试数据,共2T行,每组第一行为整数n,是2的n次幂(1<=n<=64),表示棋盘的大小为n*n,第二行是两个整数,代表特殊方格所在行号和列号。 |
Output |
先输出“CASE:i,然后按样例输出。数据间用制表符隔开(‘t’),每行最后一个数据后无制表符。 |
Sample Input |
2 2 0 0 8 2 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 |
要求遍历顺序按从左到右,从上到下。 ps:注意题干的要求是遍历顺序从左到右,从上到下 code: #include<iostream> #include<string.h> #include<stdio.h> #include<stdlib.h> using namespace std; const int MAXN=1024; int n,x,y; int cur=0; int board[MAXN][MAXN]; void chessBoard(int sx,int sy,int len,int px,int py){ if(len==1) return; int s=++cur; int mx,my; mx=sx+len/2; my=sy+len/2; if(px<mx&&py<my){ //part 1 chessBoard(sx,sy,len/2,px,py); }else{ board[mx-1][my-1]=s; chessBoard(sx,sy,len/2,mx-1,my-1); } if(px<mx&&py>=my){ //part 2 chessBoard(sx,my,len/2,px,py); }else{ board[mx-1][my]=s; chessBoard(sx,my,len/2,mx-1,my); } if(px>=mx&&py<my){ //part 3 chessBoard(mx,sy,len/2,px,py); }else{ board[mx][my-1]=s; chessBoard(mx,sy,len/2,mx,my-1); } if(px>=mx&&py>=my){ //part 4 chessBoard(mx,my,len/2,px,py); }else{ board[mx][my]=s; chessBoard(mx,my,len/2,mx,my); } } int main(){ int T; cin>>T; for(int Kase=1;Kase<=T;Kase++){ memset(board,-1,sizeof(board)); cur=0; cin>>n>>x>>y; board[x][y]=0; chessBoard(0,0,n,x,y); cout<<"CASE:"<<Kase<<endl; for(int a=0;a<n;a++){ for(int b=0;b<n;b++){ if(b) cout<<"\t"; cout<<board[a][b]; } cout<<endl; } } return 0; } |
相关文章推荐