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

این سوال دوباره به شکل بهتر و سریعتر حل شده و میتوانید از لینک زیر برای مشاهده آن استفاده کنید.

حل بهتر مسئله کارتهای برابر

این سوال از مسابقه Southeast USA 2000 انتخاب شده است.

در مورد سوال را از سایت ShareCode.ir مسئله 1003 بخوانید.

خب برای حل این مسئله چه راهی را انتخاب کرده ایم

ابتدا الگوی بازی و n را از ورودی میگیریم و وارد یک حلقه با شرط n میشویم!

شرط n در C و C++ برابر با شرط n!=0 میباشد.

چرا از n!=0 استفاده نکردیم؟ به این علت که این تکنیک ها کمی کد را جم و جور می کنند و ما نیازی به خوانایی بالای کد هایمان نداریم. به هر حال اگر استفاده هم کنید هیچ اشکالی ندارد!

خب حالا اعداد را از ورودی دریافت میکنیم ... و مطابق الگو اعدادی که مهم نیستند را صفر میکنیم ... دقت کنید به این علت میتوانیم صفر کنیم که تضمین شده است تمام اعداد مثبت میباشند در غیر اینصورت در واقع ما عنصر صفر ماتریس را در مقایسه نادیده گرفته ایم ...

خب حالا نوبت مقایسه کارت هاست ...

حلقه با شمارنده k ایندیس کارت اول را مشخص میکند

حلقه با شمارنده l ایندیس کارت دوم را مشخص میکند

حلقه با شمارنده i بعد اول کارت اول را مشخص میکند

حلقه با شمارنده j بعد دوم کارت اول را مشخص میکند

حلقه با شمارنده m بعد اول کارت دوم را مشخص میکند

حلقه با شمارنده p بعد دوم کارت دوم را مشخص میکند


خب کاری که انجام میدهیم خیلی ساده است !!! ما در واقع به ازای هر خانه ی نا صفر آرایه اول کل آرایه دوم را جستجو میکنیم... اگر یک عدد از ماتریس کارت اول در ماتریس کارت دوم وجود نداشته باشد مسلما دیگر نیازی به جستجوی بیشتر نیست و این دو کارت برابر نیستند اگر برابر بوده اند پیغام مربوطه چاپ میشود.

دوستان میدانم که خیلی از کد های زیر را میشد خلاصه کرد ولی خواستم عین کد ی که تایید شده باشد را اینجا بگزارم..

منتظر نظرات شما هستم ... و شما نیز منتظر مطالب بعدی باشید ...


#include<stdio.h>
char a[6][6];
int z=1,n,i,j,k,l,m,p,b[100][6][6],eq,eqs;
int main(){
	scanf("%s%s%s%s%s%d",a[0],a[1],a[2],a[3],a[4],&n);
	while(n){
		if(z>1)printf("\n");
		printf("Game %d\n",z);
		z++;
		for(k=0;k<n;k++)
		for(i=0;i<5;i++){
			for(j=0;j<5;j++){
			scanf("%d",&b[k][i][j]);
				if(a[i][j]=='_'){
					b[k][i][j]=0;
				}
			}
		}
		for(k=0;k<n;k++)
		for(l=0;l<k;l++){
				eq=1;
			for(i=0;i<5;i++){
				for(j=0;j<5;j++){
					if(b[k][i][j]==0)continue;
					eqs=0;
					for(m=0;m<5;m++){
						for(p=0;p<5;p++){
								
							if(b[k][i][j]==b[l][m][p]){
							eqs=1;
							break;
						}
					}
					if(eqs)break;
					}
					if(!eqs)eq=0;
					if(!eq)break;

				}

				if(!eq)break;

			}
			if(eq){
				printf("Card %d is equivalent to card %d\n",k+1,l+1);	
				break;
			}
		}	
		scanf("%s%s%s%s%s%d",a[0],a[1],a[2],a[3],a[4],&n);	
	}	
}