1.1 Transformations

     將n*n的黑白圖案按給定的七種方式中的一種轉換成另外一種狀態,求能夠完成轉換的那種方式的最小序號。這個只要從第一種方式開始依次使用每一種轉換方式,直到找到可用的轉換方式。spa

 

/*
ID: whutzha1  
PROG: transform  
LANG: C++  
*/
#include<fstream>
using namespace std;
ifstream cin("transform.in");
ofstream cout("transform.out");

bool compare(char arr1[10][10],char arr2[10][10],int n);
void change1(char arr1[10][10],int n);
void change2(char arr1[10][10],int n);

int main()
{
  char arr1[10][10],arr2[10][10],arr3[10][10];
  bool flag=false;
  int n;
  cin>>n;
  int i,j;
  for (i=0;i<n;i++)
	  for (j=0;j<n;j++)
		  cin>>arr1[i][j];
  for (i=0;i<n;i++)
	  for (j=0;j<n;j++)
		  cin>>arr2[i][j];
  int ans=7;
  //方案1 轉90度 
  for (i=0;i<n;i++)
	 for (j=0;j<n;j++)
          arr3[i][j]=arr1[i][j];
  change1(arr3,n);
  if (compare(arr2,arr3,n))  
  {
	  ans=1;
	  goto result;
  }
  //方案2 轉180度 
  change1(arr3,n);
  if (compare(arr2,arr3,n))  
  {
	  ans=2;
	  goto result;
  } 
  //方案3 轉270度 
  change1(arr3,n);
  if (compare(arr2,arr3,n))  
  {
	  ans=3;
	  goto result;
  }
  //方案4  水平翻轉 
  for (i=0;i<n;i++)
	for (j=0;j<n;j++)
        arr3[i][j]=arr1[i][j]; 
  change2(arr3,n);
  if (compare(arr2,arr3,n))
  {
       ans=4;
	   goto result;
  }
  //方案5   水平翻轉再按方案1-3中的一種轉換 
  change1(arr3,n);
  if (compare(arr2,arr3,n))
  {
       ans=5;
	   goto result;
  }
  change1(arr3,n);
  if (compare(arr2,arr3,n))
  {
       ans=5;
	   goto result;
  }
  change1(arr3,n);
   if (compare(arr2,arr3,n))
  {
       ans=5;
	   goto result;
  }
   //方案6  不改變原圖案 
   if (compare(arr1,arr2,n))
   {
       ans=6;
	   goto result;
   }
   //沒法完成轉換 結果則爲7 
  result:  cout<<ans<<endl;
  return 0;
}

bool compare(char arr1[10][10],char arr2[10][10],int n)  //判斷圖案是否相同
{
  int i,j;
  bool flag=true;
  for (i=0;i<n;i++)
	  for (j=0;j<n;j++)
	  {
		  if (arr1[i][j]!=arr2[i][j])
		  {flag=false;break;}
	  }
  return flag; 
}

void change1(char arr1[10][10],int n)  //轉90度
{
   char arr[10][10];
   int  i,j;
   for (i=0;i<n;i++)
	  for (j=0;j<n;j++)
	   {
	     arr[i][j]=arr1[i][j];
	   }
   for (i=0;i<n;i++)
	  for (j=0;j<n;j++)
	   {
	     arr1[i][j]=arr[n-1-j][i];  
	   }
}

void change2(char arr1[10][10],int n)   //水平翻轉
{
   int i,j;
   char temp;
   for (i=0;i<n;i++)
   {
      for (j=0;j<n/2;j++)
	  {
	     temp=arr1[i][j];
		 arr1[i][j]=arr1[i][n-1-j];
		 arr1[i][n-1-j]=temp;
	  }
   }
}
相關文章
相關標籤/搜索