codeforce 906 SOL (B)

Posted 殇雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforce 906 SOL (B)相关的知识,希望对你有一定的参考价值。

题目大意:老师要排座位,要求每个人的四周的邻居不是原来的,求方案

题目链接

SOL :min(n,m)<4 就暴搜,否则就构造。

#include<bits/stdc++.h>  
using namespace std;  
#define N 500017
int n,m,p[N],dx[4] = {0,1,0,-1},dy[4]={1,0,-1,0};  
bool check(int i, int j){   
    int x=(i-1)/m+1,y=(i-1)%m+1,x2=(j-1)/m+1,y2=(j-1)%m+1;  
    for (int k=0;k<4;k++) if (x+dx[k]==x2&&y+dy[k]==y2)  return 1;  
    return 0;  
}  
void write(int x){if (x<10) {putchar(0+x); return;} write(x/10); putchar(0+x%10);}
inline void writel(int x){ if (x<0) putchar(-),x*=-1; write(x); putchar( ); }
bool dfs(int i) {  
    if (i>=n*m+1) return 1;  
    int x=(i-1)/m+1,y=(i-1)%m+1;  
    for (int j=i;j<=n*m;j++)  {   
      swap(p[i],p[j]);  
      if (x^1&&check(p[i],p[(x-2)*m+y])) continue;  
      if (y^1&&check(p[i],p[(x-1)*m+y-1])) continue;  
      if (dfs(i+1))return 1;  swap(p[i], p[j]);  
    }  
    return 0;  
} 
int main(){  
    freopen("b.in","r",stdin);
    scanf("%d%d", &n, &m);  
    for (int i=1;i<=n;i++)  
        for (int j=1;j<=m;j++)  
            p[(i-1)*m+j]=(i-1)*m+j;  
    if (!dfs(1))  return puts("NO"), 0;  
    puts("YES");  
    for (int i=1;i<=n;i++,putchar(\n))  
        for (int j=1;j<=m;j++)  
          writel(p[(i-1)*m+j]);
    return 0;
}  

 

以上是关于codeforce 906 SOL (B)的主要内容,如果未能解决你的问题,请参考以下文章

[CodeForces - 906D] Power Tower——扩展欧拉定理

codeforces 906C

CodeForces906 D. Power Tower 扩展欧拉定理

Codeforces 906B. Seating of Students(构造+DFS)

CodeForces 906D Power Tower <<欧拉降幂

Codeforces 906 D Power Tower