#pragma warning(suppress : 4996)
#include <fstream>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include <vector>
using namespace std;
#define MAXSIZE 10000
typedef struct
{
int goal;//分值
string str ;//單詞長度
int lenth;//以為首字母的單詞個數
}word, * pword;
typedef struct
{
word arr2[26];//記錄二十六個字母的后續與lenth連用
word arr[MAXSIZE];//順序表
int len;//記錄當前順序表長度
}Slist, * pSlist;
typedef struct
{
int a[MAXSIZE];
int b[MAXSIZE];//記錄對應的順序表的位置
} search, * psearch;
typedef struct//儲存得分和次數
{
int x;
int y;
} goal, * pgoal;
char getlast(string x)//取單詞最后一個字符
{
int len = x.length();
return x[len - 1];
}
int getlenth(char x, Slist& s)
{
int count = 0;
for (int i = 0; i < s.len; i++)
{
if (x == s.arr[i].str[0])
{
count++;
}
}
return count;
}
int getlocation(Slist& s, string str)
{
for (int i = 0; i < s.len; i++)
{
if (str == s.arr[i].str)
{
return i;
}
}
}
bool iffind(Slist& s, char x)//是否以x開頭的單詞
{
int count = 0;
for (int i = 0; i < s.len; i++)
{
if (x == s.arr[i].str[0])
{
count = 1;
}
}
return count;
}
void init(Slist& s)
{
ifstream fin;
ofstream fout;
int count = 0;
fin.open("C:\\Users\\27536\\Desktop\\source\\四級詞匯.txt", ios::in);
//fin.open("C:\\Users\\27536\\Desktop\\source\\repos\\綜合題\\單詞表.txt", ios::in);
if (!fin.is_open())
{
cerr << "檔案無法打開" << endl;
}
while (fin >> s.arr[count].str)
{
//cout << s.arr[count].str << endl;
count++;
}
s.len = count;
for (int i = 0; i < s.len; i++)
{
s.arr[i].goal = s.arr[i].str.length();
//cout << s.arr[i].goal << endl;
}
for (int i=0; i<26; i++)
{
s.arr2[i].lenth = 0;
}
for (char ch = 'a'; ch <= 'z'; ch++)
{
s.arr2[ch-97].lenth=getlenth(ch, s);
}
}
void deleteSqlist(Slist& s,int i)
{
for (int j = i+1; j <= s.len; j++)
{
s.arr[j - 1] = s.arr[j]; //從p位置開始,后面的依次前移
s.arr[j - 1].goal = s.arr[j].goal;
s.arr[j - 1].str = s.arr[j].str;
}
s.len--;
}
void insert(Slist& s,string x)//將沒有的插入,有的不變
{
int count = 1;
for (int i = 0; i < s.len; i++)
{
if (x == s.arr[i].str)
{
count = 0;
}
}
if (count != 0)
{
s.len = s.len + 1;
s.arr[s.len-1].str = x;
s.arr[s.len-1].goal = s.arr[s.len-1].str.length();
}
}
void BubbleSort2(int arr[],int arr2[] ,int n)//從小到大冒泡排序
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
int temp2 = arr2[j];
arr2[j] = arr2[j + 1];
arr2[j + 1] = temp2;
}
}
}
}
void BubbleSort(int arr[], int arr2[], int n)//從大到小冒泡排序
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] < arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
int temp2 = arr2[j];
arr2[j] = arr2[j + 1];
arr2[j + 1] = temp2;
}
}
}
}
void output1( Slist& s,char x, search& p)//輸出分值最高的前十個,采用冒泡排序
{
int count = 0;
for (int i = 0; i < s.len; i++)
{
if (x == s.arr[i].str[0])
{
p.a[count] = s.arr[i].goal;
//cout << s.arr[i].str << endl;//輸出所有以其開頭的單詞
p.b[count] = i;
count++;
}
}
BubbleSort(p.a, p.b, count);
if (count >= 10)
{
for (int i = 0; i < 10; i++)
{
cout << s.arr[p.b[i]].str<<endl;
}
}
else
for (int i = 0; i < count; i++)
{
cout << s.arr[p.b[i]].str<<endl;
}
}
void judge(Slist& s)//洗掉表中重復的單詞
{
int count = s.len;
while (count>1)
{
if (s.arr[count - 1].str == s.arr[count - 2].str)
{
deleteSqlist(s, count);
}
count--;
}
}
int getgoal(Slist&s,string str)//找到分值
{
for (int i = 0; i < s.len; i++)
{
if (str == s.arr[i].str)
{
return s.arr[i].goal;
}
}
}
void output2(Slist& s, char a,search&p)
{
int count = 0;
for (int i = 0; i < 26; i++)
{
p.a[i] = 0;
p.b[i] = 0;
}
for(int i=0;i<s.len;i++)
{
if (a == s.arr[i].str[0])
{
char x=getlast(s.arr[i].str);
int j = x - 97;
p.a[j] = s.arr2[j].lenth;
p.b[j] = i;
}
}
int n = 26;
for (int i = 0; i < n; i++)//洗掉0元素
{
if (p.a[i] == 0)
{
for (int j = i; j < n - 1; j++)
{
p.a[j] = p.a[j + 1];
p.b[j] = p.b[j + 1];
}
i = i - 1;
n--;
}
}
BubbleSort2(p.a, p.b, n);
for (int i = 0; i < 10; i++)
{
cout << s.arr[p.b[i]].str << endl;
}
}
void output3(Slist& s,string str,search& p)
{
int len = str.length();
int count = 0;
for (int i = len-1; i >= 0; i--)
{
string a = str.substr(i);
for (int i = 0; i < s.len; i++)
{
int pos = s.arr[i].str.find(a);
if (pos != -1 and a == s.arr[i].str.substr(0,a.length()) )//找到該字符
{
s.arr[i].goal= a.length() * s.arr[i].goal;
p.a[count] = s.arr[i].goal;
p.b[count] = i;
count++;
}
}
}
BubbleSort(p.a, p.b, count);
if (count >= 10)
{
for (int i = 0; i < 10; i++)
{
cout << s.arr[p.b[i]].str << endl;
}
}
else
for (int i = 0; i < count; i++)
{
cout << s.arr[p.b[i]].str << endl;
}
}
void printtest1(Slist&s,search&p,goal&g)
{
string a, b;
int count = 0;
g.x = 0;
g.y = 0;
cout << "輸入一個英語單詞開始游戲" << endl;
cin >> a;
cout << "以" << getlast(a) << "開頭的單詞有:" << endl;
output1(s, getlast(a), p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
for (; cin >> b; )
{
if (b == "x")
{
cout << "游戲結束" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else if (!iffind(s, getlast(b)))
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
cout << "詞庫里沒有以" << getlast(b) << "詞開頭的單詞游戲結束" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
deleteSqlist(s, getlocation(s, b));//洗掉參與接龍的單詞
cout << "以" << getlast(b) << "開頭的單詞有:" << endl;
output1(s, getlast(b), p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
}
}
}
void printtest2(Slist& s, search& p, goal& g)
{
string a, b;
int count = 0;
g.x = 0;
g.y = 0;
cout << "輸入一個英語單詞開始游戲" << endl;
cin >> a;
cout << "以" << getlast(a) << "開頭的單詞有:" << endl;
output2(s, getlast(a), p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
for (; cin >> b; )
{
if (b == "x")
{
cout << "游戲結束" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else if (!iffind(s, getlast(b)))
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
cout << "詞庫里沒有以" << getlast(b) << "詞開頭的單詞游戲結束" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
deleteSqlist(s, getlocation(s, b));//洗掉參與接龍的單詞
cout << "以" << getlast(b) << "開頭的單詞有:" << endl;
output2(s, getlast(a), p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
}
}
}
void printtest3(Slist& s, search& p, goal& g)
{
string a, b;
int count = 0;
g.x = 0;
g.y = 0;
cout << "輸入一個英語單詞開始游戲" << endl;
cin >> a;
cout << "符合條件的單詞有" << endl;
output3(s, a, p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
for (; cin >> b; )
{
if (b == "x")
{
cout << "游戲結束" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else if (!iffind(s, getlast(b)))
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
cout << "沒有符合的單詞" << endl;
cout << "接龍次數為" << g.x << endl;
cout << "接龍分數為" << g.y << endl;
exit(0);
}
else
{
insert(s, b);
count++;
g.x = count;
g.y = g.y + getgoal(s, b);
deleteSqlist(s, getlocation(s, b));//洗掉參與接龍的單詞
cout << "符合條件的單詞有" << endl;
output3(s, b, p);
cout << "請從以上單詞中選取一個作為下一個物件參與接龍或按X退出游戲" << endl;
}
}
}
int main()
{
Slist s;
goal g;
search p;
init(s);
judge(s);
char ch;
cout << "-------------------------------選擇接龍模式------------------------------------------" << endl;
cout << "---------------------1為正常接龍模式顯示為單詞分數最高的前10個-----------------------" << endl;
cout << "----------------------2為顯示下一步能選擇的單詞個數最少前10個------------------------" << endl;
cout << "--------3可以顯示例如apple->lead此時分值為兩倍,并按分值大小取分值最大的前10位-------" << endl;
cout << "------------------按x或X鍵退出游戲或沒有可選擇的單詞自動退出游戲統計得分--------------" << endl;
cin >> ch;
switch (ch)
{
case'1':printtest1(s, p, g);
break;
case'2':printtest2(s, p, g);
break;
case'3':printtest3(s, p, g);
break;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395258.html
標籤:其他
