您的位置:首页 > 其它

紫书章四 Spreadsheet Tracking UVA - 512(单元格去哪了,模拟结果更简单))

2017-03-31 20:37 471 查看
开始想直接模拟单元格。。但是总是WA,还没有找到问题在哪。。之后再回来看看。

然后队友告诉我可以直接通过询问来找,这样就简单多了。我们只需要将操作的顺序记下来,然后将询问按照顺序来一遍,就可以得到answer了

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;
char s[5];
int d[150][150];
int main()
{
int r,c;
int case1=0;
while(scanf("%d %d",&r,&c)!=EOF&&r+c)
{
if(case1) printf("\n");
printf("Spreadsheet #%d\n",++case1);
int n;
scanf("%d",&n);
memset(d,0,sizeof(d));
int temp=n;
while(n--){
int h1=0,h2=0,h3=0,h4=0,h5=0;
scanf("%s",s);
int a[15];
if(s[0]=='E')
{
scanf("%d %d %d %d",&a[0],&a[1],&a[2],&a[3]);
d[temp-n][h1++]=1;
for(int i=0;i<4;i++)
d[temp-n][h1++]=a[i];
}
else {
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
scanf("%d",&a[i]);
if(s[0]=='D'){
if(s[1]=='R'){
d[temp-n][h2++]=2;
for(int i=0;i<k;i++)
d[temp-n][h2++]=a[i];
}
else if(s[1]=='C'){
d[temp-n][h3++]=3;
for(int i=0;i<k;i++)
d[temp-n][h3++]=a[i];
}
}
else if(s[0]=='I'){
if(s[1]=='R'){
d[temp-n][h4++]=4;
for(int i=0;i<k;i++)
d[temp-n][h4++]=a[i];
}
else if(s[1]=='C'){
d[temp-n][h5++]=5;
for(int i=0;i<k;i++)
d[temp-n][h5++]=a[i];
}
}
}
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int r5,c5;
scanf("%d %d",&r5,&c5);
printf("Cell data in (%d,%d) ",r5,c5);
for(int j=1;j<=temp;j++)
{
int tr5=r5,tc5=c5;
if(d[j][0]==1) {
if(r5==d[j][1]&&c5==d[j][2]){
r5=d[j][3];c5=d[j][4];
}
else if(r5==d[j][3]&&c5==d[j][4]){
r5=d[j][1];c5=d[j][2];
}
}
else if(d[j][0]==2)
{
for(int k=1;k<=10;k++)
{
if(d[j][k]==0) break;
if(d[j][k]<r5)
tr5--;
else if(d[j][k]==r5)
{
tr5=-1;break;}
}
r5=tr5;
}
else if(d[j][0]==3){
for(int k=1;k<=10;k++)
{
if(d[j][k]==0) break;
if(d[j][k]<c5)
tc5--;
else if(d[j][k]==c5)
{
tc5=-1;break;}
}
c5=tc5;
}
else if(d[j][0]==4){
for(int k=1;k<=10;k++)
{
if(d[j][k]==0) break;
if(d[j][k]<=r5)
tr5++;
}
r5=tr5;
}
else if(d[j][0]==5){
for(int k=1;k<=10;k++)
{
if(d[j][k]==0) break;
if(d[j][k]<=c5)
tc5++;
}
c5=tc5;
}
}
if(r5<1||c5<1) printf("GONE\n");
else printf("moved to (%d,%d)\n",r5,c5);
}
}
return 0;
}


以下是WA 的代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
struct node
{
int r,c;
};
int d[55][55];
char s[5];
int rw[55];
int cw[55];
int dd[55];
int r,c;
void init()
{
for(int i=1;i<=r;i++){
rw[i]=i;}
for(int j=1;j<=c;j++)
cw[j]=j;
}
void ex()//因为你不知道是哪一步ex,所以要在单元格中找到那个位子
{
int r1,c1,r2,c2;
scanf("%d %d %d %d",&r1,&c1,&r2,&c2);
int i,j;
for(i=1;i<=r;i++)
{
if(rw[i]==r1) break;
}
r1=i;
for(i=1;i<=r;i++){
if(rw[i]==r2) break;
}
r2=i;
for(i=1;i<=c;i++){
if(cw[i]==c1) break;
}
c1=i;
for(i=1;i<=c;i++){
if(cw[i]==c2) break;
}
c2=i;
d[r1][c1]=(r2-1)*c+c2;
d[r2][c2]=(r1-1)*c+c1;
}
void del()
{
int a;
scanf("%d",&a);
if(s[1]=='R')
{
memcpy(dd,rw,sizeof(rw));//要求在这个操作中都是不能的,所以要先复制在另外一个数组上
for(int i=1;i<=a;i++)
{
int k;
scanf("%d",&k);
int temp=k,g;
for(g=1;g<=r;g++){
if(dd[g]>0) temp--;
if(temp==0) break;
}
rw[g]=-1;
for(int j=g+1;j<=r;j++)
rw[j]--;
}
}
else if(s[1]=='C')
{
memcpy(dd,cw,sizeof(cw));
for(int i=1;i<=a;i++)
{
int k;
scanf("%d",&k);
int temp=k,g;
for(g=1;g<=c;g++){
if(dd[g]>0) temp--;
if(temp==0) break;
}
cw[g]=-1;
for(int j=g+1;j<=c;j++){
cw[j]--;
}
}
}
}
void inp()
{
int a;
scanf("%d",&a);
if(s[1]=='R'){
memcpy(dd,rw,sizeof(rw));
for(int i=1;i<=a;i++)
{
int k;
scanf("%d",&k);
int temp=k,g;
for(g=1;g<=r;g++){
if(dd[g]>0) temp--;
if(temp==0) break;
}
for(int j=g;j<=r;j++)
{
if(rw[j]>0) rw[j]++;
}
}
}
else if(s[1]=='C'){
memcpy(dd,cw,sizeof(cw));
for(int i=1;i<=a;i++){
int k;
scanf("%d",&k);
int temp=k,g;
for(g=1;g<=c;g++){
if(dd[g]>0) temp--;
if(temp==0) break;
}
for(int j=g;j<=c;j++)
{
if(cw[j]>0) cw[j]++;
}
}
}
}
int main()
{
//  freopen("D:\\input.txt","r",stdin);
int case1=0;
while(scanf("%d %d",&r,&c)!=EOF&&r+c)
{
if(case1) printf("\n");
printf("Spreadsheet #%d\n",++case1);
memset(cw,0,sizeof(cw));
memset(rw,0,sizeof(rw));
memset(d,0,sizeof(d));
memset(dd,0,sizeof(dd));
init();
a883

int n;
scanf("%d",&n);
while(n--){
scanf("%s",s);
if(s[0]=='E') ex();
else if(s[0]=='D') del();
else if(s[0]=='I') inp();
// sx();
}
int m;
scanf("%d",&m);
for(int i=0;i<m;i++){
int r5,c5;
scanf("%d %d",&r5,&c5);
printf("Cell data in (%d,%d) ",r5,c5);
if(d[r5][c5]) {
int ggg=d[r5][c5];
if(ggg%c==0)
{
c5=c,r5=ggg/c;
}
else{
r5=ggg/c+1;
c5=ggg%c;
}
}
if(rw[r5]<1||cw[c5]<1) printf("GONE\n");
else printf("moved to (%d,%d)\n",rw[r5],cw[c5]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: