sicily 1050 简单魔板
2014-11-06 17:20
253 查看
关键是枚举在未发生C操作之前,将第一行第三个数确定为关键字,来判断关键字的位置,来确定进行了多少次C操作。
例如:目标 1 6 2 4 没发生C操作之前的情形为 1 2 3 4
8 7 3 5 8 7 6 5
取3做关键字,然后看3在目标情形下的位置,发现只发生了一次C操作;
#include <iostream>
using namespace std;
int main()
{
int mob[2][4]={{1,2,3,4},{8,7,6,5}};
int tar[2][4];
char ans[10];
int n,i,j,sum1,s,m;
cin>>n;
while(n!=-1)
{
for(i=0;i<2;i++)
for(j=0;j<4;j++)
cin>>tar[i][j];
sum1=tar[0][0]+tar[0][1]+tar[0][2]+tar[0][3];//算出第一列的和。最简单的就是只进了A B操作;那么行之和只有10和26两种可能;
if(sum1==10)//行之和为10说明没有换行A操作,只有右移B操作
{
for(i=0;i<4;i++)
{
if(tar[0][i]==1)
{
s=i;
cout<<s<<" ";
}
ans[i]='B';
}
for(i=0;i<s;i++)
cout<<ans[i];
}
else if(sum1==26)//行之和为26说明有换行A操作
{
ans[0]='A';//先进行换行A操作,注意后面的S要自增一
for(i=0;i<4;i++)
{
if(tar[0][i]==8)
{
s=i+1;//比i大一是因为前面有换行A操作也应该计入步数中
cout<<s<<" ";
}
ans[i+1]='B';
}
for(i=0;i<s;i++)
cout<<ans[i];
}
if(sum1!=10&&sum1!=26)//既不是10也不是26是说明是发生了C操作
{
if(tar[0][0]==1||tar[0][0]==2||tar[0][0]==3||tar[0][0]==4)//即使有C操作,第一行的头和尾可以判断出他是否发生了换行操作
{
s=0;//s记录步数
for(i=3;i>=0;i--)
{
if(mob[0][i]==tar[0][3])
break;
else if(mob[0][i]!=tar[0][3])//在tar第一行末尾和mob的数比较,来判断右移了多少位
{
ans[s]='B';
s=s+1;
}
}
if(s==3)//根据右移的次数来确定比较的关键字,就是正常情况下第一行的第三个数,他的位置变化,来判断进行了多少次C操作
{
if(tar[1][2]==4)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==4)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==4)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
else
{
if(tar[1][2]==3-s)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==3-s)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==3-s)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
cout<<s<<" ";
for(i=0;i<s;i++)
cout<<ans[i];
}
else
{
s=0;
ans[s]='A';
s=s+1;
for(i=3;i>=0;i--)
{
if(mob[1][i]==tar[0][3])
break;
else if(mob[1][i]!=tar[0][3])
{
ans[s]='B';
s=s+1;
}
}
if(s==3)
{
if(tar[1][2]==5)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==5)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==5)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
else
{
if(tar[1][2]==s+6)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==s+6)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==s+6)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
cout<<s<<" ";
for(i=0;i<s;i++)
cout<<ans[i];
}
}
cin>>n;
}
}
例如:目标 1 6 2 4 没发生C操作之前的情形为 1 2 3 4
8 7 3 5 8 7 6 5
取3做关键字,然后看3在目标情形下的位置,发现只发生了一次C操作;
#include <iostream>
using namespace std;
int main()
{
int mob[2][4]={{1,2,3,4},{8,7,6,5}};
int tar[2][4];
char ans[10];
int n,i,j,sum1,s,m;
cin>>n;
while(n!=-1)
{
for(i=0;i<2;i++)
for(j=0;j<4;j++)
cin>>tar[i][j];
sum1=tar[0][0]+tar[0][1]+tar[0][2]+tar[0][3];//算出第一列的和。最简单的就是只进了A B操作;那么行之和只有10和26两种可能;
if(sum1==10)//行之和为10说明没有换行A操作,只有右移B操作
{
for(i=0;i<4;i++)
{
if(tar[0][i]==1)
{
s=i;
cout<<s<<" ";
}
ans[i]='B';
}
for(i=0;i<s;i++)
cout<<ans[i];
}
else if(sum1==26)//行之和为26说明有换行A操作
{
ans[0]='A';//先进行换行A操作,注意后面的S要自增一
for(i=0;i<4;i++)
{
if(tar[0][i]==8)
{
s=i+1;//比i大一是因为前面有换行A操作也应该计入步数中
cout<<s<<" ";
}
ans[i+1]='B';
}
for(i=0;i<s;i++)
cout<<ans[i];
}
if(sum1!=10&&sum1!=26)//既不是10也不是26是说明是发生了C操作
{
if(tar[0][0]==1||tar[0][0]==2||tar[0][0]==3||tar[0][0]==4)//即使有C操作,第一行的头和尾可以判断出他是否发生了换行操作
{
s=0;//s记录步数
for(i=3;i>=0;i--)
{
if(mob[0][i]==tar[0][3])
break;
else if(mob[0][i]!=tar[0][3])//在tar第一行末尾和mob的数比较,来判断右移了多少位
{
ans[s]='B';
s=s+1;
}
}
if(s==3)//根据右移的次数来确定比较的关键字,就是正常情况下第一行的第三个数,他的位置变化,来判断进行了多少次C操作
{
if(tar[1][2]==4)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==4)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==4)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
else
{
if(tar[1][2]==3-s)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==3-s)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==3-s)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
cout<<s<<" ";
for(i=0;i<s;i++)
cout<<ans[i];
}
else
{
s=0;
ans[s]='A';
s=s+1;
for(i=3;i>=0;i--)
{
if(mob[1][i]==tar[0][3])
break;
else if(mob[1][i]!=tar[0][3])
{
ans[s]='B';
s=s+1;
}
}
if(s==3)
{
if(tar[1][2]==5)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==5)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==5)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
else
{
if(tar[1][2]==s+6)
{
ans[s]='C';
s=s+1;
}
if(tar[1][1]==s+6)
{
ans[s]='C';
ans[s+1]='C';
s=s+2;
}
if(tar[0][1]==s+6)
{
ans[s]='C';
ans[s+1]='C';
ans[s+2]='C';
s=s+3;
}
}
cout<<s<<" ";
for(i=0;i<s;i++)
cout<<ans[i];
}
}
cin>>n;
}
}
相关文章推荐
- sicily 1150 简单魔板 sicily 1151 魔板 sicily 1515 魔板C
- Sicily 1150. 简单魔板 解题报告
- [sicily online]1150. 简单魔板
- sicily 1150. 简单魔板 & 1151. 魔板
- sicily 简单魔板2
- Sicily 1150 简单魔板 && 1151 魔板 (BFS深度优先搜索+康托展开状态压缩)
- sicily 1150 简单魔板
- sicily 1150. 简单魔板
- Sicily 1150. 简单魔板
- sicily 1150 简单魔板 sicily 1151 魔板 sicily 1515 魔板C
- Sicily1150 简单魔板
- sicily 简单魔板
- sicily 1150. 简单魔板
- Sicily 1150. 简单魔板[Speical judge]
- sicily 1150 简单魔板 & 1151 魔板 bfs
- Sicily 1150. 简单魔板
- sicily 1152. 简单的马周游问题
- Sicily 4699 简单哈希 (难得水题)
- Sicily 1151. 魔板
- sicily 1150&1151 魔板[Special judge]