10 条题解

  • 1
    @ 2023-9-26 17:07:00

    题解链接

    暴力/队列

    思路讲解:

    1. 暴力方法
    • 对于f1:

    第一种:循环访问并向前移

    forin a[n+1][i]=a[1][i];
    forin forjn a[i][j]=a[i+1][j];
    

    第二种:直接swap\text{swap}

    for(int i=1;i<n;i++) swap(a[i],a[i+1]);
    
    • 对于f2:

    第一种:循环访问并向后移

    forin a[0][i]=a[n][i];
    	for(int i=n;i>=1;i--)forjn a[i][j]=a[i-1][j];
    

    第二种:直接swap\text{swap}

    for(int i=n;i>1;i--)
    	swap(a[i],a[i-1]);
    
    • 对于f3:同上f1
    for(int i=1;i<n;i++) forjn
    		swap(a[j][i],a[j][i+1]);
    
    • 对于f4:同上f2
    for(int i=n;i>1;i--) forjn
    		swap(a[j][i],a[j][i+1]);
    
    • 对于f5:向右旋转90度,可以用mspaint\text{mspaint}自己观察,如图所示:

    变成:

    int t[N][N];
    	forin forjn t[j][n-i+1]=a[i][j];
    	forin forjn a[i][j]=t[i][j];
    
    • 对于f6、f7:循环对应的f5次数即可

    暴力方法不给出代码 要代码的看这里

    2. deque

    定义双端队列a和b,表示行的位置关系与列的位置关系

    定义bool g为记录图表方向

    输入初始位置关系:

    forin a.push_back(i),b.push_back(i);

    • 对于f1:

    a.front()a.\text{front()}移动到a.back()a.\text{back()}

    a.push_back(a.front());
    a.pop_front();
    
    • 对于f2:

    a.back()a.\text{back()}移动到a.front()a.\text{front()}

    a.push_front(a.back());
    a.pop_back();
    
    • 对于f3:同上f1
    b.push_back(b.front());
    b.pop_front();
    
    • 对于f4:同上f2
    b.push_front(b.back());
    b.pop_back();
    
    • 对于f5:向右旋转90度,如上f5:

    定义函数f为反转队列函数:

    deque<int> f(deque<int> x){
    	deque<int> t;
    	while(!x.empty()){
    		t.push_front(x.front());
    		x.pop_front();
    	}
    	return t;
    }
    

    则f5为:

    void f5(){
    	swap(a,b);
    	b=f(b);
    }
    
    • 对于f6、f7:循环对应的f5次数即可

    记得输出

    暴力输出:

    forin{
    	forjn cout<<a[i][j]<<" ";
    		cout<<"\n";
    	}
    	cout<<"\n";
    

    deque输出:

    if(!g) for(int j=1;j<=a.size();j++){
    	for(int k=1;k<=b.size();k++){
    		cout<<q[a.front()][b.front()]<<" ";
    		b.push_back(b.front()); b.pop_front();
    	} 
    	a.push_back(a.front()); a.pop_front();
    	cout<<endl;
    }else for(int j=1;j<=a.size();j++){
    	for(int k=1;k<=b.size();k++){
    		cout<<q[b.front()][a.front()]<<" ";
    		b.push_back(b.front()); b.pop_front();
    	} 
    	a.push_back(a.front()); a.pop_front();
    	cout<<endl;
    }
    cout<<endl;
    

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define int ll
    #define mem memset
    #define pin(c) scanf("%lld",&(c))
    #define forin for(int i=1;i<=n;i++)
    #define forim for(int i=1;i<=m;i++)
    #define forjn for(int j=1;j<=n;j++)
    #define forjm for(int j=1;j<=m;j++)
    #define forkn for(int k=1;k<=n;k++)
    #define forkm for(int k=1;k<=m;k++)
    #define Forx(c,l,r,p) for(int (c)=(l);(c)<=(r);(c)+=(p))
    #define Fory(c,l,r,p) for(int (c)=(l);(c)>=(r);(c)-=(p))
    const int N=1e2+10;
    const int INF=0x3f3f3f3f;
    deque<int> a,b;
    int n,q[N][N];
    deque<int> f(deque<int> x){
    	deque<int> t;
    	while(!x.empty()){
    		t.push_front(x.front());
    		x.pop_front();
    	}
    	return t;
    }
    void f5(){
    	swap(a,b);
    	b=f(b);
    }
    signed main(){
    	int t,c;
    	bool g=0;
    	pin(n),pin(t);
    	forin forjn pin(q[i][j]);
    	forin a.push_back(i),b.push_back(i);
    	for(int i=1;i<=t;i++){
    		pin(c);
    		if(c==1){
    			a.push_back(a.front());
    			a.pop_front();
    		}else if(c==2){
    			a.push_front(a.back());
    			a.pop_back();
    		}else if(c==3){
    			b.push_back(b.front());
    			b.pop_front();
    		}else if(c==4){
    			b.push_front(b.back());
    			b.pop_back();
    		}else if(c==5){
    			f5(); g=!g;
    		}else if(c==6){
    			f5(),f5();
    		}else if(c==7){
    			f5(),f5(),f5(); g=!g;
    		}
    		if(!g) for(int j=1;j<=a.size();j++){
    			for(int k=1;k<=b.size();k++){
    				cout<<q[a.front()][b.front()]<<" ";
    				b.push_back(b.front()); b.pop_front();
    			} 
    			a.push_back(a.front()); a.pop_front();
    			cout<<endl;
    		}else for(int j=1;j<=a.size();j++){
    			for(int k=1;k<=b.size();k++){
    				cout<<q[b.front()][a.front()]<<" ";
    				b.push_back(b.front()); b.pop_front();
    			} 
    			a.push_back(a.front()); a.pop_front();
    			cout<<endl;
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    

    信息

    ID
    2956
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    649
    已通过
    166
    上传者