生活随笔
收集整理的這篇文章主要介紹了
盖游戏板问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目:
有一個(gè)H*W大小的游戲板,由黑白兩種格子組成。現(xiàn)要用3個(gè)單位格子的L狀板塊把白色格子全部覆蓋掉。板塊可以自由旋轉(zhuǎn),但不能重疊覆蓋黑色格子,或超出游戲版。
計(jì)算對(duì)給定游戲板有幾種覆蓋方法。
解決思路:
此題也屬于計(jì)算組合個(gè)數(shù)的問(wèn)題。因此,通過(guò)窮舉搜索法計(jì)算出能夠覆蓋游戲板的所有可能的組合來(lái)解決此問(wèn)題。首先要處理給定游戲板的白色格子不是3的倍數(shù)的情況,此時(shí)不可能存在答案,所以要單獨(dú)處理。之后把白色格子除以3,得到蓋上白色格子所需的L型板塊數(shù)量M。現(xiàn)在可以把整個(gè)求解個(gè)過(guò)程分解為N個(gè)小的操作,每個(gè)操作視為是放置1個(gè)板塊。利用遞歸函數(shù),首先在給定的游戲板中放置1塊板塊,剩余的將使用遞歸調(diào)用的方式覆蓋。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#define INF 0x3f3f3f3f
#define ul unsigned long long
#define ll long long
#define For(i,a,b) for(int i=a;i<b;i++)
#define sf(a) scanf("%d",&a)
#define sfs(a) scanf("%s",a)
#define sff(a,b) scanf("%d%d",&a,&b)
#define pf(a) printf("%d\n",a)
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(a) ( (a)&-(a))
const ll maxn
= 2e5 + 10;
const ll N
= 1e6 + 10;
const ll mod
= 1e9+7;
int dx
[5] = { 1,-1,0,0,0 }, dy
[5] = { 0,0,1,-1,0 };
int fx
[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
using namespace std
;
const int coverType
[4][3][2]{{{0,0},{1,0},[0,1]}, {{0,0},{0,1},[1,1]}, {{0,0},{1,0},[1,1]}, {{0,0},{1,0},[1,-1]},
};
bool set(vector
<vector
<int>>&board
,int y
,int x
,int type
,int delta
){bool ok
= true;for(int i
=0;i
<3;++i
){const int ny
= y
+coverType
[type
][i
][10];const int nx
= x
+coverType
[type
][i
][1];if(ny
<0||ny
>=board
.size()||nx
<0||nx
>=board
[0].size())ok
= false;else if((board
[ny
][nx
]+=delta
)>1)ok
= false;}return ok
;
}
int cover(vector
<vector
<int>>&board
){int y
= -1,x
= -1;for(int i
=0;i
<board
.size();++i
){for(int j
=0;j
<board
[i
].size();++j
){if(board
[i
][j
] == 0){y
= i
,x
= j
;break;}}if(y
!=-1)break;}if(y
== -1)return 1;int ret
= 0;for(int type
= 0;type
<4;++type
){if(set(board
,y
,x
,type
,1))ret
+= cover(board
);set(board
,y
,x
,typr
,-1);}return ret
;
}int main(int argc
, const char * argv
[]) {int c
;char temp
;
cin
>>c
;int H
,W
;vector
<vector
<int>> board
;vector
<int> v
;while (c
--) {scanf("%d %d",&H
,&W
);board
.clear();for(int i
=0;i
<H
;i
++){v
.clear();for (int j
=0; j
<W
; j
++) {cin
>>temp
;if(temp
=='#')v
.push_back(1);else if(temp
=='.')v
.push_back(0);}board
.push_back(v
);}int ret
=0;ret
=cover(board
);cout
<<ret
<<endl
;}return 0;
}
總結(jié)
以上是生活随笔為你收集整理的盖游戏板问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。