做到這個題目的時候發現和前面的那個題目非常的像,都是字符都是表格。依然是用一個二維字符數組,儲存表格的狀況,然後進行搜索判斷。
先寫一下我犯的錯誤吧,讀者看到我犯過的錯誤之後說不定就找到自己的方法了呢。畢竟題目還是要自己想出來的比較好。
1. 錯誤的認爲字符字串前的數字是第幾個字母
2. 錯誤的使用對行處理的方法處理列,字串亂序輸出
遇到的問題:
1. 找不到字符子串前的數字的規律。(解決方法:在書上發現這個數字是字符字串的起始字母對應的起始格的編號。)
2. 豎向選擇的字符字串輸出亂序(解決方法:使用結構體數組儲存結果,然後根據起始數組對數組進行排序,最後輸出)
好了大概就這麼多了,貼一下代碼, 前面的題目的一些代碼在gihub的倉庫裏https://github.com/YinAoXiong/Algorithmic-exercises,(全部都是用vs2015寫的工程文件,源文件在同名的子目錄目錄中)
#include<iostream>
#include<string>
#include<cctype>
#include<fstream>
using namespace std;
int is_the_begin(const char a[][11],int i,int j) //判斷是否爲起始字符
{
if ((i - 1) < 0 || a[i - 1][j] == '*' || (j - 1) < 0 || a[i][j - 1] == '*')
return 1;
else
return 0;
}
int main()
{ /*文件重定向,輸出測試*/
ifstream fin;
fin.open("data.in");
cin.rdbuf(fin.rdbuf());
ofstream out;
out.open("data.out");
cout.rdbuf(out.rdbuf());
int r = 0, c = 0,key=1,t=0; //r,c儲存行和列,key標記次數,
while (cin>>r>>c&&r!=0)
{
if (++t > 1) //用來控制輸出中的空行,首行前和最後一行後無空行,輸出用空行隔開
cout << endl;
cin.get(); //清除回車
char a[11][11] = { 0 }; //儲存字符
for (int i = 0; i < r; ++i) //輸入字符
{
for (int j = 0; j < c; ++j)
{
cin.get(a[i][j]);
}
cin.get();
}
cout << "puzzle #" << key << ':' << endl;
++key;
cout << "Across" << endl;
int begin = 0; //儲存當前是幾個起始格
for (int i = 0; i < r; ++i) //輸出行字串
{
for (int j = 0; j < c; ++j)
{
if (isupper(a[i][j])) //判斷是不是大寫字母
{
if (is_the_begin(a, i, j))
{
if (begin+1<10)
cout << " " << begin+1 << '.';
else
cout << ' ' << begin+1 << '.';
for (j; j < c; ++j)
{
if (a[i][j] != '*')
{
if (is_the_begin(a, i, j))
++begin;
cout << a[i][j];
}
else
break;
}
cout << endl;
}
}
}
}
int x[11][11] = { 0 } ; //用來儲存字母對應是第幾個起始符
begin = 0;
for (int i = 0; i < r; ++i)
{
for (int j = 0; j < c; ++j)
{
if (isupper(a[i][j]))
{
if (is_the_begin(a, i, j))
{
begin += 1;
x[i][j] = begin;
}
}
}
}
struct answer //定義一個結構體用來儲存結果
{
int id;
string z;
};
answer b[100];
int m = 0; //用來表示用了多少個結構體
for (int j = 0; j < c; ++j) //將結果付給結構體
{
for (int i = 0; i < r; ++i)
{
if (isupper(a[i][j]))
{
if (is_the_begin(a, i, j))
{
b[m].id = x[i][j]; //將是第幾個起始格付給結構體
//int q = i;
for (i; i < r; ++i)
{
if (a[i][j] != '*')
{
b[m].z += a[i][j]; //將字符串賦值
}
else
break;
}
++m; //m加一進入下一個結構體
}
}
}
}
for(int i=0;i<m-1;++i) //用冒泡排序法對結構體根據id進行排序
for (int j = 0; j < m - i - 1; ++j)
{
if (b[j].id > b[j + 1].id)
{
answer temp;
temp = b[j];
b[j] = b[j + 1];
b[j+1] = temp;
}
}
cout << "Down" << endl;
for (int i = 0; i < m; ++i) //輸出結果
{
if(b[i].id<10)
cout << " " << b[i].id << '.' << b[i].z << endl;
else
cout << ' ' << b[i].id << '.' << b[i].z << endl;
}
}
}
如有不對的地方歡迎大家評論指正,這裏是我在github上的一個博客,感興趣的可以去看一下哦。