1 hashcode
求字符串的hash值 | |
描述: |
對於形如abcd...n的字符串,求字符串散列值((((a*31 + b) * 31 + c) * 31)+...)*31 + n |
運行時間限制: | 無限制 |
內存限制: | 無限制 |
輸入: |
字符串,如abcd |
輸出: |
字符串對應的hashcode值,是一個整數 |
樣例輸入: |
abc |
樣例輸出: |
96354 |
答案提示: |
hashcode可能超過32位整數最大值,考慮使用64位整數 |
PS:測試結果爲答案錯誤,還未找到原因。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
cin >> str;
long long hashcode = str[0];
int i;
for(i = 1; i < str.size(); i++)
{
hashcode = hashcode*31+str[i];
}
if(str.size() == 0)
{
cout << 0 << endl;
}
else
{
cout << hashcode << endl;
}
system("pause");
return 0;
}
2、單詞迷宮
Word Maze 是一個網絡小遊戲,你需要找到以字母標註的食物,但要求以給定單詞字母的順序喫掉。如上圖,假設給定單詞if,你必須先喫掉i然後才能喫掉f。
注意區分英文字母大小寫,你只能上下左右行走。 |
|
運行時間限制: | 無限制 |
內存限制: | 無限制 |
輸入: |
輸入第一行包含兩個整數n、m(0<n, m<21)分別表示n行m列的矩陣,第二行是長度不超過100的單詞W,從第3行到底n+3行是隻包含大小寫英文字母的長度爲m的字符串。 |
輸出: |
如果能在地圖中連成給定的單詞,則輸出“YES”,否則輸出“NO”。注意:每個字母只能用一次。 |
樣例輸入: |
5 5 SOLO CPUCY EKLQH CRSOL EKLQO PGRBC |
樣例輸出: |
YES |
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int MAX = 30;
int N, M;
string sGoal; // 待匹配字符串
struct Node
{
int row;
int col;
};
char chess[MAX][MAX]; // 記錄單詞迷宮
bool visit[MAX][MAX]; // visit[i][j] = true表示[i][j]是否已經走過,
bool ava[MAX][MAX]; // ava[i][j] = true表示[i][j]在單詞迷宮內
// ava[i][j] = false表示[i][j]已經越界
vector<Node> vec; // 儲存符合待匹配字符串起始字符的位置
int r[] = {-1, 0, 1, 0};
int c[] = {0, -1, 0, 1};
// row: 迷宮橫座標 col:迷宮縱座標 index:已經搜索到符合要求的字符串長度 length:待匹配字符串長度
bool DFS(int row, int col, int index, int length)
{
if(index == length) // 已經在迷宮內搜索到符合要求的字符串
{
return true;
}
int i;
for(i = 0; i < 4; i++) // 0~3表示分別代表上,左,下,右四個方向進行搜索
{
int rt = row + r[i]; // 根據搜索方向更新座標
int ct = col + c[i];
if(!visit[rt][ct] && ava[rt][ct] && chess[rt][ct] == sGoal[index]) // 判斷更新後狀態是否滿足要求
{
visit[rt][ct] = true;
if( DFS( rt, ct, index+1, length) ) // DFS
{
return true;
}
visit[rt][ct] = false;
}
}
return false;
}
int main()
{
cin >> N >> M;
cin >> sGoal;
int i,j;
memset(visit, false, sizeof(visit)); // 初始化爲false;
memset(ava, false, sizeof(ava));
for(i = 1; i <= N; i++) // 輸入單詞迷宮
{
for(j = 1; j <= M; j++)
{
char cTemp;
cin >> cTemp;
chess[i][j] = cTemp;
ava[i][j] = true; // 單詞迷宮內ava[i][j]=true
if(cTemp == sGoal[0]) // 將待匹配字符串起始字母作爲DFS搜索的起點,節省時間
{
Node temp;
temp.row = i;
temp.col = j;
vec.push_back(temp);
}
}
}
bool flag = false; // flag = false表示在單詞迷宮內沒有搜索到待匹配字符
for(i = 0 ; i < vec.size(); i++)
{
if( DFS(vec[i].row, vec[i].col, 1, sGoal.size()) )
{
cout << "YES" << endl;
flag = true;
break;
}
}
if(!flag)
{
cout << "NO" << endl;
}
return 0;
}
3、計算麻將番數
(樣題,已對外公佈)計算麻將的番數 | |
描述: |
計算麻將的番數 麻將遊戲越來越受到大家喜愛,也在網絡上盛行。本題目是給定一組已經和牌的麻將,編寫一個函數計算這組麻將的番數。爲簡化題目,假設麻將只有筒子和條子兩種花型,能翻番的規則也只有以下三種,當一組牌中沒有下述三種情況中的一種或多種,則這組牌爲0番,每種番數是加的關係,例如一組牌既有卡2條又有四歸一,則番數爲3番。 1.卡2條爲一番,即有一局牌是 1條2條3條; 2.四歸一爲兩番,即有4張一樣的牌(花色和數字都一樣); 3.巧七對爲兩番,即一組牌恰好是7對牌; 一些約定: 1.一組已經和牌的麻將由多局牌組成,一局牌可以是一對牌、3張連續同樣花色的牌、3張一樣的牌、4張一樣的牌。 2.一組已經和牌一般有14張牌,最多可以有18張牌(當有四歸一的時候)。
|
運行時間限制: | 無限制 |
內存限制: | 無限制 |
輸入: |
一字符串表示已經和牌的麻將(由輸入者保證,編程人員無需考慮沒有和牌),如1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D. 說明: 1.”1T”表示1條,T表示條子,前面跟數字幾表示幾條,數據範圍1~9,輸入者保證,編程無需考慮輸入規範性; 2.”4D”表示4筒,D表示筒子,前面跟數字幾表示幾筒,數據範圍是1~9, 輸入者保證,編程無需考慮輸入規範性; 3.每局牌之間由’,’隔開,輸入者保證每局牌都是正確的且按照數字由小到大排序,編程人員無需判斷每局牌的正確性; 4.一組牌以’.’號結束,由輸入者保證,編程人員無需考慮是否有”.”號。 5.輸入保證有番數的牌在一局中,編程人員無需考慮排序,即有番數的牌不會分散在多局牌中。
|
輸出: |
麻將的番數,整型類型。
|
樣例輸入: |
1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D. |
樣例輸出: |
1 |
答案提示: |
只輸出番數,且爲整型。
|
#pragma warning(disable:4786)
#include <map>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<string> vec; // 保存每一局的牌
map<string, int> m; // 保存每一局的對數
int main()
{
string str; // 一組牌
cin >> str;
string::size_type pos = str.find(',');
string sTemp(str.begin(), str.begin()+pos);
vec.push_back(sTemp);
while(pos != string::npos)
{
string::size_type pos_temp = pos;
pos = str.find(',', pos+1);
string sTemp;
if( pos != string::npos)
{
sTemp.assign(str.begin()+pos_temp+1, str.begin()+pos);
}
else
{
sTemp.assign(str.begin()+pos_temp+1, str.end()-1);
}
vec.push_back(sTemp);
}
int i,j;
int count = 0; // 番數
int number = 0; // 對數
string s1("1T2T3T");
int step; // 當step == 4,即當局牌裏有四歸一
for(i = 0; i < vec.size(); i++)
{
if( vec[i] == s1 ) // 卡2條
{
count++;
continue;
}
m.clear();
string str1;
step = 1;
for(j = 0; j < vec[i].size(); j += 2) // 保存每一局裏的對子數
{
string stemp(vec[i].begin()+j, vec[i].begin()+j+2);
if( stemp == str1 )
{
step++;
}
m[stemp]++;
str1 = stemp;
}
map<string, int>::iterator mit = m.begin(); // 統計每一局裏的對子數
for(; mit != m.end(); mit++)
{
if( mit->second > 1 )
{
number += (mit->second/2);
}
}
if(step == 4) // 四歸一
{
count += 2;
}
}
if(number == 7) //巧七對
{
count += 2;
}
cout << count << endl;
return 0;
}