題目地址:
http://noi.openjudge.cn/ch0205/1159/
我出現的問題:
所有能找到的測驗資料都正確通過了,但是上傳就Wrong Answer,想要知道自己的代碼是哪里出錯了!拜托了!
我的思路:
先把能找到的鑰匙找齊,然后開所有能開的門,然后再找所有能找到鑰匙,然后再開所有能開的門,每次回圈都是找鑰匙+開門,如果回圈沒打開門則回圈結束(此時地圖里的所有門都打開了),然后看看能不能找到G
我的代碼:
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef struct{
int x;
int y;
} P;
int go[][2]={
0, 1,
1, 0,
0, -1,
-1, 0
};
P s, g;
int m,n;
char omap[20][20];
P find(char ch){
P now, next, ans;
char map[20][20];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map[i][j]=omap[i][j];
}
}
queue<P> q;
q.push(s);
if(map[s.x][s.y]==ch){
return s;
}
map[s.x][s.y]='X';
while(!q.empty()){
now = q.front();
q.pop();
for(int i=0;i<4;i++){
next.x=now.x+go[i][0];
next.y=now.y+go[i][1];
if(next.x<0||next.x>=m||next.y<0||next.y>=n)continue;
if(map[next.x][next.y]==ch){
return next;
}
if(map[next.x][next.y]=='X'||map[next.x][next.y]=='A'||map[next.x][next.y]=='B'||map[next.x][next.y]=='C'||map[next.x][next.y]=='D'||map[next.x][next.y]=='E')continue;
q.push(next);
map[next.x][next.y]='X';
}
}
ans.x=-1;
ans.y=-1;
return ans;
}
void oneCase(int m, int n){
int a=0,b=0,c=0,d=0,e=0,sa,sb,sc,sd,se;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%c",&omap[i][j]);
if(omap[i][j]=='S'){
s.x=i;
s.y=j;
}
if(omap[i][j]=='G'){
g.x=i;
g.y=j;
}
if(omap[i][j]=='a'){
a++;
}
if(omap[i][j]=='b'){
b++;
}
if(omap[i][j]=='c'){
c++;
}
if(omap[i][j]=='d'){
d++;
}
if(omap[i][j]=='e'){
e++;
}
}
getchar();
}
int flag = 1;
P ans;
while(flag){
flag = 0;
ans=find('a');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
a--;
if(a==0)break;
ans=find('a');
}
ans=find('b');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
b--;
if(b==0)break;
ans=find('b');
}
ans=find('c');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
c--;
if(c==0)break;
ans=find('c');
}
ans=find('d');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
d--;
if(d==0)break;
ans=find('d');
}
ans=find('e');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
e--;
if(e==0)break;
ans=find('e');
}
if(a==0){
ans=find('A');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(b==0){
ans=find('B');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(c==0){
ans=find('C');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(d==0){
ans=find('D');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(e==0){
ans=find('E');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
}
ans = find('G');
if(ans.x!=-1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
int main(){
scanf("%d %d",&m,&n);
while(!(m==0&&n==0)){
getchar();
oneCase(m, n);
scanf("%d %d",&m,&n);
}
}
uj5u.com熱心網友回復:
代碼看上去很長但是很容易理解uj5u.com熱心網友回復:
可能是輸入格式控制問題, 不是演算法問題.改成std::cin 輸入看看
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
typedef struct{
int x;
int y;
} P;
int go[][2]={
0, 1,
1, 0,
0, -1,
-1, 0
};
P s, g;
int m,n;
char omap[20][20];
P find(char ch){
P now, next, ans;
char map[20][20];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map[i][j]=omap[i][j];
}
}
queue<P> q;
q.push(s);
if(map[s.x][s.y]==ch){
return s;
}
map[s.x][s.y]='X';
while(!q.empty()){
now = q.front();
q.pop();
for(int i=0;i<4;i++){
next.x=now.x+go[i][0];
next.y=now.y+go[i][1];
if(next.x<0||next.x>=m||next.y<0||next.y>=n)continue;
if(map[next.x][next.y]==ch){
return next;
}
if(map[next.x][next.y]=='X'||map[next.x][next.y]=='A'||map[next.x][next.y]=='B'||map[next.x][next.y]=='C'||map[next.x][next.y]=='D'||map[next.x][next.y]=='E')continue;
q.push(next);
map[next.x][next.y]='X';
}
}
ans.x=-1;
ans.y=-1;
return ans;
}
void oneCase(int m, int n){
int a=0,b=0,c=0,d=0,e=0,sa,sb,sc,sd,se;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
// scanf("%c",&omap[i][j]);
cin >> omap[i][j];
if(omap[i][j]=='S'){
s.x=i;
s.y=j;
}
if(omap[i][j]=='G'){
g.x=i;
g.y=j;
}
if(omap[i][j]=='a'){
a++;
}
if(omap[i][j]=='b'){
b++;
}
if(omap[i][j]=='c'){
c++;
}
if(omap[i][j]=='d'){
d++;
}
if(omap[i][j]=='e'){
e++;
}
}
getchar();
}
int flag = 1;
P ans;
while(flag){
flag = 0;
ans=find('a');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
a--;
if(a==0)break;
ans=find('a');
}
ans=find('b');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
b--;
if(b==0)break;
ans=find('b');
}
ans=find('c');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
c--;
if(c==0)break;
ans=find('c');
}
ans=find('d');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
d--;
if(d==0)break;
ans=find('d');
}
ans=find('e');
while(ans.x!=-1){
omap[ans.x][ans.y]='.';
e--;
if(e==0)break;
ans=find('e');
}
if(a==0){
ans=find('A');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(b==0){
ans=find('B');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(c==0){
ans=find('C');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(d==0){
ans=find('D');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
if(e==0){
ans=find('E');
if(ans.x!=-1){
flag=1;
omap[ans.x][ans.y]='.';
}
}
}
ans = find('G');
if(ans.x!=-1){
printf("YES\n");
}
else{
printf("NO\n");
}
}
int main(){
//scanf("%d %d",&m,&n);
cin >> m >> n;
while(!(m==0&&n==0)){
//getchar();
oneCase(m, n);
// scanf("%d %d",&m,&n);
cin >> m >> n;
}
}
uj5u.com熱心網友回復:
有蝦米好神奇的,輸出是不符合題目樣例要求,要求輸入2個不是單獨一個就輸出,是2個最后同時輸出。uj5u.com熱心網友回復:
真的是這樣!謝謝您!uj5u.com熱心網友回復:
oj的輸出判斷邏輯不是這樣的哦uj5u.com熱心網友回復:
請問這兩種格式在這里的區別是什么呢?百思不得其解,謝謝大佬啦~uj5u.com熱心網友回復:
不認為輸入代碼有蝦米問題。uj5u.com熱心網友回復:
cin 會自動忽略空格和換行.你原來的代碼, 只要把輸入提前寫入檔案, 然后用輸入重定向代替手動輸入, 就會出錯.
測驗平臺顯然不會手動輸資料的.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67751.html
標籤:C++ 語言
上一篇:C語言多次輸入多個數的回圈
下一篇:請大神解答
