輸入六個矩形的長和寬,判斷是否可以組成長方體
如果六個矩形的長和寬呈如下格式,便可組成:
a b a b b c b c a c a c
(a, b, c 分別代表三種數,且互相可以相等) 下面一步一步來處理 首先在輸入時給長寬排序,即對每一個矩形數據有: 左 < 右 然后我使用一個二維數組vis[maxn][maxn]來維護一種矩形的出現次數(vis[a][b]即為矩形(a,b)出現的次數),每當一種矩形出現滿兩次時,就計數一次,這樣最后計數如果不等于3的話就說明不可能組成長方體 但是就算是計數等于3了,也不一定可以組成,比如說:
1 2 1 2 1 2 1 2 1 2 1 2
或者
1 1 1 1 1 1 1 1 1 2 1 2
等這樣的數據就不行,那么還要滿足什么條件呢 我發現,如果我統計a b c 的出現次數的話,理論上來說 a b c 都應該是4的整數倍才行,然而上面兩個樣例好像并不滿足這個條件 而且我也認為如果在計數等于3的前提下滿足了這個條件,那么它一定就可以組成矩形了,所以這里就統計一下abc的出現次數即可
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn = 1e4 +5;#define met(a,b) memset(a, b, sizeof(a));int a[6][2];int vis[maxn][maxn];int b[maxn];int main(){ #ifdef _LOCAL freopen("in.txt","r", stdin); #endif // _LOCAL while(scanf("%d%d", &a[0][0], &a[0][1]) == 2){ if(a[0][0] > a[0][1]) swap(a[0][0], a[0][1]); for(int i = 1; i < 6; ++i){ scanf("%d%d", &a[i][0], &a[i][1]); if(a[i][0] > a[i][1]) swap(a[i][0], a[i][1]); } //計數 met(vis, 0);met(b, 0); int cnt = 0; for(int i = 0; i < 6; ++i){ if(!vis[a[i][0]][a[i][1]] || vis[a[i][0]][a[i][1]] >= 2) { vis[a[i][0]][a[i][1]] = 0; ++cnt; } ++vis[a[i][0]][a[i][1]]; ++b[a[i][0]]; ++ b[a[i][1]]; } if(cnt != 3) {新聞熱點
疑難解答