中级农民
- 积分
- 267
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2020-7-22
- 最后登录
- 1970-1-1
|
Rules: https://service.mattel.com/instruction_sheets/BJV44-Eng.pdf
多谢lz分享,试着写了第一问,就把形状rotate四个方向,每个方向在board上check一遍,是这个意思么?
第三问规则上说相同颜色只能角对角,不能touch along side,这也太难了吧,怎么check啊。。。
- public class Blockus {
- public static void main(String[] args) {
- Blockus sol=new Blockus();
- int[][] shape={{0,1,0},{1,1,1}};
- int[][] board={{1,0,0},{1,0,1}};
- System.out.println(sol.canFit(shape,board));
- }
- public boolean canFit(int[][] shape, int[][]board) {
- for(int i=0;i<4;i++) {
- if(isFit(shape,board)) return true;
- int[][] rot=rotate(shape);
- shape=rot;
- }
- return false;
- }
- private boolean isFit(int[][] shape, int[][] board) {
- int row=board.length, col=board[0].length, rs=shape.length,cs=shape[0].length;
- for(int i=0;i<=row-rs;i++) {
- for(int j=0;j<=col-cs;j++) {
- int x;
- for(x=0;x<rs;x++) {
- int y;
- for(y=0;y<cs;y++) {
- if(shape[x][y]==1&&board[i+x][j+y]==1) break;
- }
- if(y<cs) break;
- }
- if(x==rs) return true;
- }
- }
- return false;
- }
- private int[][] rotate(int[][] shape) {
- int r=shape.length, c=shape[0].length;
- int[][] rotated = new int[c][r];
- for(int i=0;i<r;i++)
- for(int j=0;j<c;j++)
- rotated[j][r-1-i]=shape[i][j];
- return rotated;
- }
- }
复制代码 |
|