前一阵子,一个在USC读书(master in AI)的哥们发来了他们一门课的作业题,让我帮着看看,我就试着写了一下,学习了学习,想看看美帝硅谷的CS学生都在学什么。
题目是这样的:
读入一个文件,which描述了一个N*N的矩阵,里面有些障碍物,然后要往里放皇后(国象的后),要使得他们之间互不能影响到。然后现在要求我们用三种方法解决这个问题:DFS、BFS、SA,分别是深搜、宽搜、模拟退火。作业的pdf文件很长,我节选了一下原文:
You will write a program that will take an input file that has an arrangement of trees and will output a new arrangement of lizards (and trees; as already mentioned, you can’t move the trees) such that no baby lizard can eat another one. You will be required to create a program that finds the solution. To find the solution you will use the following algorithms:
- Breadth-first search (BFS)
- Depth-first search (DFS)
- Simulated annealing (SA).
Input: The file input.txt in the current directory of your program will be formatted as follows:
First line: instruction of which algorithm to use: BFS, DFS or SA
Second line: strictly positive 32-bit integer n, the width and height of the square nursery
Third line: strictly positive 32-bit integer p, the number of baby lizards
Next n lines: the n x n nursery, one file line per nursery row (to show you where the trees are).
It will have a 0 where there is nothing, and a 2 where there is a tree.So for instance, an input file arranged like figure 2B (but with no lizards yet) and requesting you to use the DFS algorithm to place 8 lizards in the 8x8 nursery would look like:
DFS
88
00000000
00000000
00000000
00002000
00000000
00000200
00000000
00000000
Output: The file output.txt which your program creates in the current directory should be formatted as follows:
First line: OK or FAIL, indicating whether a solution was found or not.
If FAIL, any following lines are ignored.
Next n lines: the n x n nursery, one line in the file per nursery row, including the baby lizards
and trees. It will have a 0 where there is nothing, a 1 where you placed a baby lizard, and a 2 where there is a tree.
For example, a correct output.txt for the above sample input.txt (and matching Figure 2B) is:
OK
00000100
10000000
00001000
01002001
00000000
00100200
00000010
00010000
对于这个问题,我写了BFS和DFS的代码解决掉了,SA的我没写,哥们写的。
怎么说呢,BFS写了个结点(Node)保存了很多状态,比较麻烦把,DFS相对直观暴力一些。
DFS代码(py):
F=[
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
]
ans=[]#the position of Queens
N=8
P=8
def solve():#N is the Size of raw and col,P is the number of Queens
#read in F,N,P
startp=-1
for i in range(N*N):
if F[i/N][i%N]==0:
startp=i
break
if startp==-1:
print "FALL"
return 0
if dfs(P,startp):
print "OK"
print ans
else:
print "FALL"
return 0
def dfs(num,startP):#number of Queens left,start Position
if num==0:return True
for i in range(startP,N*N):
if F[i/N][i%N]==0 and judge(i):
ans.append(i)
if dfs(num-1,i+1):return True
ans.pop()
return False
def judge(position):#judge whether valid
ansLen=len(ans)
for i in range(ansLen):
curx=ans[i]/N
cury=ans[i]%N
px=position/N
py=position%N
dx=curx-px
dy=cury-py
if dx==0 or dy==0 or abs(dx)==abs(dy):
if dx!=0:dx=dx/abs(dx)
if dy!=0:dy=dy/abs(dy)
flag=0
while (not(px == curx and py == cury)):
px += dx
py += dy
if (F[px][py] == 2):
flag=1
break
if flag==0:
return False
return True
solve()
for i in range(N):
F[ans[i]/N][ans[i]%N]=1
print F
#include
#pragma comment(linker,"/STACK:1024000000,1024000000")
using namespace std;
const int MAX_SIZE=1000;
int N,P;
int F[MAX_SIZE][MAX_SIZE];
char inputS[5];
struct Point{
int x,y;
Point(){}
Point(int X,int Y){
x=X;
y=Y;
}
};
vectorans;
struct Node{
int cnt;
vectorS;
Node(){}
Node(int c,vectorinS){
cnt=c;
S=inS;
}
void addP(Point p){
cnt+=1;
S.push_back(p);
}
bool judgeP(Point p){
int fuck=0;
for(int i=0;iq;
vectorinit;
init.push_back(inP);
Node firstNode=Node(1,init);
q.push(firstNode);
while(!q.empty()){
Node cur=q.front();
q.pop();
if(cur.cnt==P){
ans=cur.S;
return true;
}
Point lastP=cur.S[cur.cnt-1];
int curx=lastP.x;
int cury=lastP.y;
for(int i=curx*N+cury+1;i>inputS;
if(inputS[0]=='B'){
cin>>N>>P;
for(int i=0;i