100722A
这道题抄了答案:
思路:旋转,其实只用旋转四次,因为在换行的过程中旋转其实是没有意义的,因为行列只不过转了个角度。然后主要的是行列的交换,这里我很头疼,写了个盲目搜索,当然wa掉了
问了问某位同志,是这样做的,很巧妙:其实这是一个全排列,一个三个数的全排列套了三个数的全排列,然后该怎么做呢?这里运用了一个巧妙的方法:range
range很巧妙,分两种情况:当我选完了三列时,这时我需要新的一列,那么我返回(0,8),意思是下一个列可以从(0,8)之间没用过的任选。第二呢,是我正在选三列中的一列,这时
我看看上一列我选的什么,这次我选的只能是(上一列设为x)[x/3*3,x/3*3+2]举个例子:(0,1,2) (3,4,5)(6,7,8)其实就是这三个块,他们每三个数必须绑在一起
然后我搜完了列之后搜行(搜行的时候我犯了个错误,对应残缺的数独下标没想清楚,debug了很长时间,下次应该想清楚)然后就是重复同样的过程,只不过要加上置换,
置换需要用一个额外的数组记录是那一列的时候替换的,因为会导致还原的时候不知道哪些要还原,然后就好了。
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; typedef pair<int,int> pii; string s;
int used_col[],used_row[],place[];
int pos_row[],pos_col[],place_flag[];
int b[][],c[][]; void init()
{
memset(place_flag,-,sizeof(place_flag));
memset(place,-,sizeof(place));
memset(pos_row,-,sizeof(pos_row));
memset(pos_col,-,sizeof(pos_col));
memset(used_row,,sizeof(used_row));
memset(used_col,,sizeof(used_col));
} pii get_range(int pos,int f)
{
if(pos%==) return pii(,);
int head=;
if(!f) head=pos_row[pos-]/*;
else head=pos_col[pos-]/*;
return pii(head,head+);
} void rotate()
{
int a[][];memset(a,,sizeof(a));
for(int i=;i<;i++)
for(int j=;j<;j++) a[-j-][i]=b[i][j];
for(int i=;i<;i++)
for(int j=;j<;j++) b[i][j]=a[i][j];
} bool go_col(int d)
{
if(d==) return true;
pii range=get_range(d,);
for(int i=range.first;i<=range.second;i++) if(!used_col[i])
{
used_col[i]=;
pos_col[d]=i;
bool flag=false;
for(int j=;j<;j++)
{
int x=b[pos_row[j]][pos_col[d]],y=c[j][d];
if(y==) continue;
if(place[x]!=-&&place[x]!=y) {flag=true;break;}
if(place[x]==-)
{
place[x]=y;
place_flag[x]=d;
}
}
if(!flag) if(go_col(d+)) return true;
for(int j=;j<;j++)
{
int x=b[pos_row[j]][pos_col[d]];
if(place_flag[x]==d) {place_flag[x]=-;place[x]=-;}
}
used_col[i]=;
pos_col[d]=-;
}
return false;
} bool go_row(int d)//行
{
if(d==) return go_col();
pii range=get_range(d,);
for(int i=range.first;i<=range.second;i++)
{
if(!used_row[i])
{
used_row[i]=;
pos_row[d]=i;
if(go_row(d+)) return true;
used_row[i]=;
pos_row[d]=-;
}
}
return false;
} bool work()
{
for(int i=;i<;i++)
{
init();
rotate();
if(go_row()) return true;
}
return false;
} int main()
{
int T;scanf("%d",&T);
while(T--)
{
for(int i=;i<;i++)
{
cin>>s;
for(int j=;j<;j++)
{
b[i][j]=s[j]-'';
}
}
for(int i=;i<;i++)
{
cin>>s;
for(int j=;j<;j++)
{
c[i][j]=s[j]-'';
}
}
if(work()) printf("Yes\n"); else printf("No\n");
}
return ;
}
100722A的更多相关文章
随机推荐
- Unity Shader IDE — Sublime Text2
使用MonoDevelop写了一段时间的Shader代码,发现效率太低了,所以换用Sublime Text. 安装Sublime Text 1.下载 sublime Text2 官网:http://w ...
- cookie 和 session 的基础知识
cookie 和 session 的基础知识 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会 ...
- Linux下mysql新建账号及权限设置
http://www.cnblogs.com/eczhou/archive/2012/07/12/2588187.html 1.权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连 ...
- u3d_shader_surface_shader_5
CubeMap 的实现 参考: http://blog.csdn.net/candycat1992/article/details/21827365 制作cubeMap三维纹理,surface ...
- [No000049]狗日的中年——姜文
文件名 大小 [No000049]狗日的中年——姜文.7z 228KB
- java 22 - 10 多线程之两种代码实现方式的比较与区别
- javascript里面this机制的几个例子
javascript里面的this值会随着使用场景的不同二发生变化,但是总有一个原则,那就是this总指向当前调用函数的那个对象.以下我会举几个例子来说明这个问题.1.this本身总是指向当前的类的实 ...
- Maya 与 Matlab 数据互联插件使用教程
实验室做网格处理方面的算法,写界面很麻烦,所以有了利用maya和matlab进行数据连通的念头,于是有了这个插件. 这个插件可以把maya的网格数据导入matlab之中,完成计算之后重新返回maya. ...
- java类型转换
//java类型转换public class Demo2 { public static void main(String[] args){ int num1 = 55; int num2 =77; ...
- Java集合系列:-----------04fail-fast总结(通过ArrayList来说明fail-fast的原理以及解决办法)
前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例3 f ...