題目分析:
很明顯這道題的資料量很大,所以不可能進行兩兩的判斷,所以需要將可能相同的資料對映到乙個集合中,然後在可能相同的資料集合中進行兩兩比較。如果兩組資料六個數的和相同,那麼就有可能是相同的雪花。但是六個數的和可能比較大,怎麼把它們分開呢,那只能建立乙個hash表,然後通過mod乙個比較大的素數來分到相應的集合裡面。
關於這個比較大的素數怎麼取呢?
六個數的和最大是6*10^7,如果我們允許每個集合最多有100個資料(如果太多的話,比較的時間就會比較長)。那麼最大的和為6*10^5。但是不可能按照最大和來取這個素數。大概小十倍左右。具體取法可能需要試一下。
#include#includeconst int n = 19373;
int hash[n][100][6];
int nlen[n];
bool judge(int *a, int *b)
if(k >= 6)
return true;
//逆時針
for(k = 0; k < 6; ++k)
if(k >= 6)
return true;
} return false;
}int main()
sum %= n;
for(i = 0; i < 6; ++i)
hash[sum][nlen[sum]][i] = a[i];
++nlen[sum];
} for(k = 0; k < n; ++k)
}if(flag)//找到乙個就可以跳出迴圈了
break;
}if(flag)
break;
} if(flag)
printf("twin snowflakes found.\n");
else
printf("no two snowflakes are alike.\n");
}}
nyoj 130 相同的雪花
題目連線 題意 乙個雪花有六個角,每個角對應乙個值,給出n個雪花,問能不能是否存在兩片相同的雪花 給出的角可能是逆序的 解題思路 由於有很多雪花,因此資料很大,如果單純的進行直接查詢的話肯定會te,因此可以用雜湊的方法,其中雜湊函式可以用每個雪花的各個角的和來定義 然後對映到相應的位置。一旦找到就不...
NYOJ 130 相同的雪花 雜湊
思路 以每組的和為key對每片雪花進行雜湊,然後從和相等的雪花裡進行匹配。注意雪花的匹配順序可以順時針也可以逆時針 include include include include using namespace std const int maxn 100001 最大數量 const int mod...
100 相同的樹
鏈結 給定兩個二叉樹,編寫乙個函式來檢驗它們是否相同。如果兩個樹在結構上相同,並且節點具有相同的值,則認為它們是相同的。示例 1 輸入 1 1 2 3 2 3 1,2,3 1,2,3 輸出 true示例 2 輸入 1 1 2 2 1,2 1,null,2 輸出 false示例 3 輸入 1 1 2 ...