POJ 2801 为什么相同功能的代码会wrong answer呢?求解释~~
生活随笔
收集整理的這篇文章主要介紹了
POJ 2801 为什么相同功能的代码会wrong answer呢?求解释~~
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制:?1000m ? ? ?內存限制:65536kB描述Alex喜歡填詞游戲。填詞是游戲是一個非常簡單的游戲。填詞游戲包括一個N * M大小的矩形方格盤和P個單詞。玩家需要把每個方格中填上一個字母使得每個單詞都能在方格盤上找到。每個單詞都能找到要滿足下面的條件:
每個方格都不能同時屬于超過一個的單詞。一個長為k的單詞一定要占據k個方格。單詞在方格盤中出現的方向只能是豎直的或者水平的。
你的任務是首先在方格盤上找到所有的單詞,當然在棋盤上可能有些方格沒有被單詞占據。然后把這些沒有用的方格找出來,把這些方格上的字母按照字典序組成一個“神秘單詞”。
如果你還不了解規則,我們可以具一個例子,比如在下圖中尋找單詞BEG和GEE。
輸入輸入的第一行包括三個整數N,M和P (2 <= M, N <= 10, 0 <= P <=100)。接下來的N行,每行包括M個字符,來表示方格盤。接下來P行給出需要在方格盤中找到的單詞。
輸入保證填詞游戲至少有一組答案。
輸入中給出的字母都是大寫字母。 輸出輸出“神秘單詞”,注意“神秘單詞”中的字母要按照字典序給出。 樣例輸入 3 3 2EBGGEEEGEBEGGEE
樣例輸出 EEG
(1)、源代碼: #include<stdio.h>
#include<string.h>
int main()
{
int ch[26];
memset(ch,0,sizeof(ch));
int i,n,m,p;
char str[200];
char c;
scanf("%d%d%d",&n,&m,&p);
while(n--){ scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']++; }
while(p--){
scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']--;
}
for(i=0;i<26;i++){
if(ch[i]!=0)
while(ch[i]--){
c='A'+i;
printf("%c",c);
}
}
return 0;
} (2)、解題思路 這道題的巧妙之處在于輸入保證填詞游戲至少有一組答案——這說明我們不必尋找單詞所在的位置,只要去掉這些單詞所占用的字母就可以了。“神秘單詞”按字典序給出,則只要定義一個有26個元素的數組,記錄每個字母出現的次數,當讀入單詞時,相應字母的元素值減一即可。最后將數組中非0的元素對應字母一次輸出。 (3)、出錯原因: a、對題目理解不透徹,移位要找出單詞的填法; b、未知:我的C++版代碼如下,總是wrong answer,不知原因,求解釋: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int main()
{
???? int M, N, P;
???? cin >> M >> N >> P;
???? char c;
???? int i, j;
???? int num[26];
???? memset(num, 0, sizeof(num));
???? for(i = 0; i < N; i++)
???? {
????????? string word;
????????? cin >> word;
????????? for(j = 0; word[j] != '\0'; j++)
?????????????? num[word[j] - 'A']++;
???? }
???? for(i = 0; i < P; i++)
???? {
????????? string word;
????????? cin >> word;
????????? for(j = 0; word[j] != '\0'; j++)
?????????????? num[word[j]-'A']--;
???? }
???? for(i = 0; i < 26; i++)
???? {
????????? if(num[i] != 0)
?????????????? for(j = 0; j < num[i]; j++)
?????????????? {
??????????????????? c = 'A' + i;
??????????????????? cout << c;
?????????????? }
???? }
???? return 0;
}
每個方格都不能同時屬于超過一個的單詞。一個長為k的單詞一定要占據k個方格。單詞在方格盤中出現的方向只能是豎直的或者水平的。
你的任務是首先在方格盤上找到所有的單詞,當然在棋盤上可能有些方格沒有被單詞占據。然后把這些沒有用的方格找出來,把這些方格上的字母按照字典序組成一個“神秘單詞”。
如果你還不了解規則,我們可以具一個例子,比如在下圖中尋找單詞BEG和GEE。
輸入保證填詞游戲至少有一組答案。
輸入中給出的字母都是大寫字母。
(1)、源代碼: #include<stdio.h>
#include<string.h>
int main()
{
int ch[26];
memset(ch,0,sizeof(ch));
int i,n,m,p;
char str[200];
char c;
scanf("%d%d%d",&n,&m,&p);
while(n--){ scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']++; }
while(p--){
scanf("%s",str);
for(i=0;str[i]!='\0';i++)
ch[str[i]-'A']--;
}
for(i=0;i<26;i++){
if(ch[i]!=0)
while(ch[i]--){
c='A'+i;
printf("%c",c);
}
}
return 0;
} (2)、解題思路 這道題的巧妙之處在于輸入保證填詞游戲至少有一組答案——這說明我們不必尋找單詞所在的位置,只要去掉這些單詞所占用的字母就可以了。“神秘單詞”按字典序給出,則只要定義一個有26個元素的數組,記錄每個字母出現的次數,當讀入單詞時,相應字母的元素值減一即可。最后將數組中非0的元素對應字母一次輸出。 (3)、出錯原因: a、對題目理解不透徹,移位要找出單詞的填法; b、未知:我的C++版代碼如下,總是wrong answer,不知原因,求解釋: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int main()
{
???? int M, N, P;
???? cin >> M >> N >> P;
???? char c;
???? int i, j;
???? int num[26];
???? memset(num, 0, sizeof(num));
???? for(i = 0; i < N; i++)
???? {
????????? string word;
????????? cin >> word;
????????? for(j = 0; word[j] != '\0'; j++)
?????????????? num[word[j] - 'A']++;
???? }
???? for(i = 0; i < P; i++)
???? {
????????? string word;
????????? cin >> word;
????????? for(j = 0; word[j] != '\0'; j++)
?????????????? num[word[j]-'A']--;
???? }
???? for(i = 0; i < 26; i++)
???? {
????????? if(num[i] != 0)
?????????????? for(j = 0; j < num[i]; j++)
?????????????? {
??????????????????? c = 'A' + i;
??????????????????? cout << c;
?????????????? }
???? }
???? return 0;
}
轉載于:https://www.cnblogs.com/lydf-2012/archive/2012/04/12/2444588.html
總結
以上是生活随笔為你收集整理的POJ 2801 为什么相同功能的代码会wrong answer呢?求解释~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕笔记本怎么开bios设置 华硕笔记本
- 下一篇: win7优盘识别不了怎么办 解决win7