華爲在線軟件訓練與測試

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。


    但現在你的任務可沒有這麼簡單,你現在處於一個迷宮Maze(n×m的矩陣)當中,裏面到處都是以字母標註的食物,但你只能喫掉能連成給定單詞W的食物。


如下圖,指定W爲“SOLO”,則在地圖中紅色標註了單詞“SOLO”。 

 

注意區分英文字母大小寫,你只能上下左右行走。

運行時間限制: 無限制
內存限制: 無限制
輸入:

輸入第一行包含兩個整數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條爲一番,即有一局牌是 123條;

2.四歸一爲兩番,即有4張一樣的牌(花色和數字都一樣);

3.巧七對爲兩番,即一組牌恰好是7對牌;

  一些約定:

1.一組已經和牌的麻將由多局牌組成,一局牌可以是一對牌、3張連續同樣花色的牌、3張一樣的牌、4張一樣的牌。

2.一組已經和牌一般有14張牌,最多可以有18張牌(當有四歸一的時候)

 

運行時間限制: 無限制
內存限制: 無限制
輸入:

一字符串表示已經和牌的麻將(由輸入者保證,編程人員無需考慮沒有和牌),如1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.

說明:

1.”1T”表示1條,T表示條子,前面跟數字幾表示幾條,數據範圍19,輸入者保證,編程無需考慮輸入規範性;

     2.”4D”表示4筒,D表示筒子,前面跟數字幾表示幾筒,數據範圍是19, 輸入者保證,編程無需考慮輸入規範性;

     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;
}  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章