PDA

View Full Version : کد با خروجی درست ولی ظاهرا اشتباه



sa1378
دوشنبه 21 مهر 1393, 09:15 صبح
سلام
این سوالی هست که باید براش کد بزنم:
گربه‌های فضایی


دانشمندان فضایی دورترین سیاره‌ی یافته شده را «سیاره دوردست» نامگذاری کرده‌اند. سیاره دوردست گربه‌های عجیبی دارد. این گربه‌ها علاقه زیادی به حرکت به سمت شمال دارند. آنها وقتی صبح از خواب بیدار می‌شوند، سعی می‌كنند به سمت شمال قدم بردارند. هنگام قدم زدن به سمت شمال اگر مانعی جلوی قدم زدنشان را بگیرد، به سمت شرق حركت می‌كنند. بعد از هر قدم که به سمت شرق بر می‌دارند، اگر باز بتوانند به سمت شمال حرکت کنند، به سمت شمال می‌روند و در غیر این صورت به حرکتشان به سمت شرق ادامه می‌دهند. البته در شرایطی که حرکت به سمت شمال امکان پذیر نباشد و راهی هم برای رفتن به سمت شرق نداشته باشند، در همان محل متوقف می‌شوند.
این گربه‌ها با اینكه هوش زیادی ندارند، اما حروف انگلیسی را می‌شناسند! به همین دلیل در اولین محل قرار گرفتنشان حرف a و در هر یک از قدمهای بعدی به ترتیب حروف الفبا را می‌نویسند. البته این گربه‌ها بیشتر از ۲۵ قدم بر نمی‌دارند.
http://bayanbox.ir/id/8872882014512250453?view
می‌دانیم در ابتدا یک گربه در جنوبی‌ترین و غربی‌ترین مكان شهر قرار دارد. شما باید با دریافت نقشه شهر مشخص کنید که گربه چه حرفهایی را در چه مکانهایی خواهد نوشت.
ورودی

در سطر اول ورودی t نشان دهنده تعداد تست‌ها آمده است. به ازای هر یک از t تست ورودی،‌ شهر به صورت یک جدول n∗n تشریح شده است. به این صورت كه در سطر اول هر تست عدد $n نشان دهنده تعداد سطرها و ستونهای جدول می‌باشد. در n سطر بعدی در هر سطر n کاراکتر نوشته شده است که می‌تواند "-" یا "" باشد. وجود کاراکتر "-" در یک خانه بدین معنی است که گربه می‌تواند به این خانه برود و کاراکتر "" یعنی گربه نمی‌تواند به این خانه برود. در ابتدا گربه در خانه اول سطر n ام خوابیده است.


1≤t≤100
1≤n≤50

خروجی

به ازای هر تست، در جدول ورودی در هر خانه‌ای كه گربه در آن حرفی می‌نویسد حرف نوشته شده را جایگزین كنید. سپس جدول را چاپ کنید.

ورودی نمونه

3
3
---
---
---
4
----
**--
----
----
3
---
**-
--*
خروجی نمونه

cde
b--
a--
--fg
**e-
bcd-
a---
---
**-
ab*



من این کد رو نوشتم و به ازای ورودی هایی که خود سوال داده بود و چندتا ورودی دیگه امتحان کردم ولی جاج میگه که اشتباهه


#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstdio>


using namespace std;

int main()
{

ifstream fin("input.txt");
ofstream fout("output.txt");
int t=0;
int a[100];
char nn[100][50][50]={0};
fin>>t;
for(int i=0;i<t;i++)
{
fin>>a[i];
char q;
for(int k1=0;k1<a[i];k1++)
for(int k2=0;k2<a[i];k2++)
{
fin>>q;
nn[i][k1][k2]=q;
}

}
for(int i=0;i<t;i++)
{
int a1=(a[i]-1),a2=0;
nn[i][a1][a2]='a';
int p=1;
while((nn[i][a1-1][a2]=='-' || nn[i][a1][a2+1]=='-' ) && (a1<a[i] && a2<a[i]))
{
if(nn[i][a1-1][a2]=='-')
a1--;
else if (nn[i][a1][a2+1]=='-')
a2++;
p++;
switch (p)
{
case 2: nn[i][a1][a2]='b';break;
case 3: nn[i][a1][a2]='c';break;
case 4: nn[i][a1][a2]='d';break;
case 5: nn[i][a1][a2]='e';break;
case 6: nn[i][a1][a2]='f';break;
case 7: nn[i][a1][a2]='g';break;
case 8: nn[i][a1][a2]='h';break;
case 9: nn[i][a1][a2]='i';break;
case 10: nn[i][a1][a2]='j';break;
case 11: nn[i][a1][a2]='k';break;
case 12: nn[i][a1][a2]='l';break;
case 13: nn[i][a1][a2]='m';break;
case 14: nn[i][a1][a2]='n';break;
case 15: nn[i][a1][a2]='o';break;
case 16: nn[i][a1][a2]='p';break;
case 17: nn[i][a1][a2]='q';break;
case 18: nn[i][a1][a2]='r';break;
case 19: nn[i][a1][a2]='s';break;
case 20: nn[i][a1][a2]='t';break;
case 21: nn[i][a1][a2]='u';break;
case 22: nn[i][a1][a2]='v';break;
case 23: nn[i][a1][a2]='u';break;
case 24: nn[i][a1][a2]='x';break;
case 25: nn[i][a1][a2]='y';break;
case 26: nn[i][a1][a2]='z';break;
}
}
for(int j1=0;j1<a[i];j1++)
{
for(int j2=0;j2<a[i];j2++)
fout<<nn[i][j1][j2];
fout<<endl;
}
}
system("PAUSE");
return EXIT_SUCCESS;
}


خیلی ممنون میشم اگه کد رو اصلاح کنین

توضیح کد:

متغیر t تعداد مجموعه های ورودی هست که میگیریم
آرایه [a[100 هم مقدار n رو مشخص میکنه که نشون میده جدول چند در چند هست (100 هم برای اینه که حداکثر 100 بار باید ورودی دریافت کنیم)
nn[100][50][50 هم که نشانه 100 تا جدول 50x50 هست که حداکثر مقدار دریافتی هست

حلقه for اولی که فقط ورودی هارو میگیره

حلقه for دومی هم که برای محاسبه هست و به ازای هر i (مجموعه ی ورودی های دریافتی که مقدارش حداکثر t هست) میاد اول از سمت پایین چپ جدول شروع میکنه(تعریف متغیر های a1 و a2 ) و توی خونه اول a رو مینویسه
متغیر p هم نشون میده که گربه توی چندمین حرکت خودش هست
یه حلقه while داره که بررسی میکنه اگه خونه بالا یا راست یکیشون باز بودن و از جدول هم بیرون نزدن میره توی حلقه
توی حلقه هم اول میبینه که بالایی بازه؟ اگه بود میره بالا و اگه نبود میره سمت راست
بعد به میبینه که توی حرکت چندم هستیم و طبق اون یه حرف رو قرار میده

آخرش هم جدول رو چاپ میکنه

فکر کنم واضح بوده توضیح
اگه نبوده هم بگید کجاش مبهمه

shahmohammadi
دوشنبه 21 مهر 1393, 10:34 صبح
سلام.
می‎شه آدرس سوال رو هم بذارید؟.

omid_kma
دوشنبه 21 مهر 1393, 12:11 عصر
طبیعتا این کدی که شما نوشتید رو با این روش اسم گذاری کسی غیر از خودتون هم نمی تونه بفهمه چکار می کنه که بخواد درستش کنه.
مثلا این مدلی میشه حل کرد :

http://coliru.stacked-crooked.com/a/3942fed234398c90

sa1378
دوشنبه 21 مهر 1393, 13:39 عصر
سلام.
می‎شه آدرس سوال رو هم بذارید؟.
فکر کنم باید ثبتنام کرده باشین توی سایتش تا بتونین سوال رو ببینین
توی سوالات تمرینی سایت بیان هست
http://contest.bayan.ir/

sa1378
دوشنبه 21 مهر 1393, 13:40 عصر
طبیعتا این کدی که شما نوشتید رو با این روش اسم گذاری کسی غیر از خودتون هم نمی تونه بفهمه چکار می کنه که بخواد درستش کنه.
مثلا این مدلی میشه حل کرد :

http://coliru.stacked-crooked.com/a/3942fed234398c90
من فقط دنبال جواب نیستم
میخوام ببینم این چجوری حل میشه
کد شمارو هم نفهمیدم اصلا
یه توضیح هم به کد اضافه میکنم الان

mehdi.0345
دوشنبه 21 مهر 1393, 15:26 عصر
سلام کسی نیست کمک کنه؟

shahmohammadi
دوشنبه 21 مهر 1393, 18:46 عصر
توی کد که به جای w باز هم u نوشتی. ولی همون کدهای سویچ رو میتونستی راحت تر بنویسی.
nn[i][a1][a2]=(char)(p+96)

sa1378
دوشنبه 21 مهر 1393, 21:40 عصر
توی کد که به جای w باز هم u نوشتی. ولی همون کدهای سویچ رو میتونستی راحت تر بنویسی.
nn[i][a1][a2]=(char)(p+96)
ممنون درست شد
من کد های اسکی و از این جور چیزا رو بلد نیستم نمیخوام هم یاد بگیرم
فوقش 5 دقیقه صرفه جویی میشد تو وقت
ولی احتمال خطا هم کمتر میشد

shahmohammadi
دوشنبه 21 مهر 1393, 22:25 عصر
می تونید خود حروف رو هم بنویسید:
nn[i][a1][a2]=(char)(p+'a'-1)




موفق باشید.