1.1 Transformations

     将n*n的黑白图案按给定的七种方式中的一种转换成另一种状态,求可以完成转换的那种方式的最小序号。这个只要从第一种方式开始依次使用每一种转换方式,直到找到可用的转换方式。

 

/*
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;
	  }
   }
}

你可能感兴趣的:(USACO,方块转换)