我一直在寻找传教士和食人族的问题解决方案。经过大量搜索,我终于到达了下面的代码,但编译时显示了一些错误。
我将#include <iostream.h>
更改为#include<iostream>
并添加了using namespace std;
但编译时仍然显示一些错误:
[[错误]':: main'必须返回'int'在函数'int main()'中[警告]不建议将字符串常量转换为'char *'[-Wwrite-strings][错误]名称查询“ i”已更改为ISO“用于”范围[-fpermissive][注意](如果您使用“ -fpermissive”,G ++将接受您的代码)
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
void rectangel(int x1,int y1,int x2,int y2)
{
line(x1,y1,x2,y1);
line(x1,y1,x1,y2);
line(x1,y2,x2,y2);
line(x2,y1,x2,y2);
}
struct node{
int state[3];
int action[2];
int depth;
int veiw;
}root;
struct node empty={ 0,0,0,
0,0,
0,
0
};
struct node stack[50];
int top=0;
void clear()
{
for(int j=0;j<=50;j++)
stack[top]=empty;
}
void push(struct node t)
{
stack[top]=t;
top++;
}
struct node pop()
{
top--;
return stack[top];
}
int emptyf()
{
if(top==0)
return 1;
else return 0;
}
void succesor(struct node n)
{
struct node k;
if(n.state[2]==1)
{
k.depth=n.depth+1;
k.state[0]=n.state[0]-1;
k.state[1]=n.state[1];
k.state[2]=0;
k.action[0]=-1;
k.action[1]=0;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0]-2;
k.state[1]=n.state[1];
k.state[2]=0;
k.action[0]=-2;
k.action[1]=0;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0];
k.state[1]=n.state[1]-1;
k.state[2]=0;
k.action[0]=0;
k.action[1]=-1;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0];
k.state[1]=n.state[1]-2;
k.state[2]=0;
k.action[0]=0;
k.action[1]=-2;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0]-1;
k.state[1]=n.state[1]-1;
k.state[2]=0;
k.action[0]=-1;
k.action[1]=-1;
k.veiw=0;
push(k);
}
if(n.state[2]==0)
{
k.depth=n.depth+1;
k.state[0]=n.state[0]+1;
k.state[1]=n.state[1];
k.state[2]=1;
k.action[0]=1;
k.action[1]=0;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0];
k.state[1]=n.state[1]+1;
k.state[2]=1;
k.action[0]=0;
k.action[1]=1;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0]+2;
k.state[1]=n.state[1];
k.state[2]=1;
k.action[0]=2;
k.action[1]=0;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0]+1;
k.state[1]=n.state[1]+1;
k.state[2]=1;
k.action[0]=1;
k.action[1]=1;
k.veiw=0;
push(k);
k.depth=n.depth+1;
k.state[0]=n.state[0];
k.state[1]=n.state[1]+2;
k.state[2]=1;
k.action[0]=0;
k.action[1]=2;
k.veiw=0;
push(k);
}
}
int goal=0;
struct node IDS(int l)
{
struct node g;
while(emptyf()!=1 && goal!=1)
{
g=pop();
if(g.depth!=0 && g.state[0]==3 && g.state[1]==3 && g.state[2]==1)
continue;
if ((g.state[0]==0 && g.state[1]==2 && g.state[2]==0) ||
(g.state[0]==1 && g.state[1]==2 && g.state[2]==0) ||
(g.state[0]==0 && g.state[1]==1 && g.state[2]==0) ||
(g.state[0]==1 && g.state[1]==2 && g.state[2]==1))
continue;
if(g.state[0]<0 || g.state[1]<0 || g.state[0]>3 || g.state[1]>3)
continue;
if(g.state[0]>g.state[1] && g.state[1]!=0)
continue;
if(g.state[0]==0 && g.state[1]==0 && g.state[2]==0)
{
goal=1;
struct node mmm=g;
return mmm;
}
if(g.depth<l && g.veiw==0)
{
g.veiw=1;
push(g);
succesor(g);
}
}
return g;
}
void main()
{
//clrscr();
int gdriver = DETECT , gmode , errorcode;
initgraph(&gdriver, &gmode, "d:\\tc\\bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
cout<<"Graphics error: %s\n"<< grapherrormsg(errorcode)<<endl;
cout<<"Press any key to halt:";
getch();
exit(1);
}
root.state[0]=3;
root.state[1]=3;
root.state[2]=1;
root.action[0]=0;
root.action[1]=0;
root.depth=0;
root.veiw=0;
int d=0;
struct node km;
while(goal!=1)
{
clear();
push(root);
km=IDS(d);
d++;
}
int array[40];
int dd=km.depth;
int index=0;
array[index]=km.state[2];
index++;
array[index]=km.state[1];
index++;
array[index]=km.state[0];
cout<<"depth="<<d<<endl;
while(!(km.state[0]==3 && km.state[1]==3 && km.state[2]==1))
{
km=pop();
if(km.depth==dd)
continue;
if(km.depth==dd-1)
{
index++;
array[index]=km.state[2];
index++;
array[index]=km.state[1];
index++;
array[index]=km.state[0];
dd=km.depth;
}
}
int count=0;
int tmparay[40];
for(int i=0;i<index+1;i++)
tmparay[i]=array[index-i];
count=0;
int aray[12][3];
for(i=0;i<12;i++)
{
aray[i][0]=tmparay[count];
count++;
aray[i][1]=tmparay[count];
count++;
aray[i][2]=tmparay[count];
count++;
}
for(i=0;i<12;i++)
{
for(int j=0;j<3;j++)
cout<<" "<<aray[i][j];
cout<<endl;
}
cout<<" Missionaries"<<endl<<endl<<endl<<endl<<endl;
cout<<endl<<endl<<endl<<endl<<endl;
cout<<" Cannibals";
rectangel(150,200,250,400);
for(i=0;i<12;i++)
{
if(aray[i][2]==1)
{
if((aray[i][0]==3) && (aray[i][1]==3))
{
setcolor(0);
rectangel(220,280,250,330);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
}
else if((aray[i][0]==3) && (aray[i][1]==0))
{
setcolor(0);
rectangel(220,280,250,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
}
else if((aray[i][0]==2) && (aray[i][1]==3))
{
setcolor(0);
rectangel(220,280,250,330);
rectangel(120,370,140,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,370,280,390);
}
else if((aray[i][0]==2) && (aray[i][1]==2))
{
setcolor(0);
rectangel(290,370,310,390);
rectangel(220,280,250,330);
rectangel(320,370,340,390);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(120,370,140,390);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,210,280,230);
rectangel(260,370,280,390);
}
else if((aray[i][0]==2) && (aray[i][1]==0))
{
setcolor(0);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
rectangel(290,370,310,390);
rectangel(120,370,140,390);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(260,370,280,390);
}
else if((aray[i][0]==1) && (aray[i][1]==3))
{
setcolor(0);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(220,280,250,330);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(150,280,180,330);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
}
else if((aray[i][0]==1) && (aray[i][1]==1))
{
setcolor(0);
rectangel(260,210,280,230);
rectangel(260,370,280,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(220,280,250,330);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(150,280,180,330);
rectangel(60,210,80,230);
rectangel(60,370,80,390);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
}
else if((aray[i][0]==1) && (aray[i][1]==0))
{
setcolor(0);
rectangel(220,280,250,330);
rectangel(320,370,340,390);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(60,370,80,390);
rectangel(150,280,180,330);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
}
}
if(aray[i][2]==0)
{
if((aray[i][0]==3) && (aray[i][1]==3))
{
setcolor(0);
rectangel(150,280,180,330);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
}
else if((aray[i][0]==3) && (aray[i][1]==0))
{
setcolor(0);
rectangel(150,280,180,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
}
else if((aray[i][0]==2) && (aray[i][1]==3))
{
setcolor(0);
rectangel(150,280,180,330);
rectangel(120,370,140,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,370,280,390);
}
else if((aray[i][0]==2) && (aray[i][1]==2))
{
setcolor(0);
rectangel(290,370,310,390);
rectangel(150,280,180,330);
rectangel(320,370,340,390);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(120,370,140,390);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,210,280,230);
rectangel(260,370,280,390);
}
else if((aray[i][0]==2) && (aray[i][1]==0))
{
setcolor(0);
rectangel(150,280,180,330);
rectangel(320,370,340,390);
rectangel(290,370,310,390);
rectangel(120,370,140,390);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(260,370,280,390);
}
else if((aray[i][0]==1) && (aray[i][1]==3))
{
setcolor(0);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(150,280,180,330);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(320,370,340,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
rectangel(220,280,250,330);
}
else if((aray[i][0]==1) && (aray[i][1]==1))
{
setcolor(0);
rectangel(150,280,180,330);
rectangel(260,210,280,230);
rectangel(260,370,280,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,210,80,230);
rectangel(60,370,80,390);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
}
else if((aray[i][0]==1) && (aray[i][1]==0))
{
setcolor(0);
rectangel(150,280,180,330);
rectangel(320,370,340,390);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(60,370,80,390);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
}
else if((aray[i][0]==0) && (aray[i][1]==3))
{
setcolor(0);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(150,280,180,330);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
setcolor(7);
rectangel(150,200,250,400);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(220,280,250,330);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
}
else if((aray[i][0]==0) && (aray[i][1]==0))
{
setcolor(0);
rectangel(60,210,80,230);
rectangel(90,210,110,230);
rectangel(120,210,140,230);
rectangel(60,370,80,390);
rectangel(90,370,110,390);
rectangel(120,370,140,390);
rectangel(150,280,180,330);
setcolor(7);
rectangel(150,200,250,400);
rectangel(220,280,250,330);
rectangel(260,210,280,230);
rectangel(290,210,310,230);
rectangel(320,210,340,230);
rectangel(260,370,280,390);
rectangel(290,370,310,390);
rectangel(320,370,340,390);
}
}
getch();
}
getch();
}
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9rVzRQNy5wbmcifQ==” alt =“在此处输入图像描述”>
编译器报告的第一个错误是:“ :: main必须返回int”
如果将主要功能更改为
int main(void) {
...
your code
...
return 0;
}
错误应该消失。
第二个错误:您在for周期中声明了“ i”。在for循环之后,它在c ++中不再可用。
此代码将无法编译:
for(int i = 0; i <5;++i) {
...
}
for(i = 0; i <5;++i) { // error i variable doesn't exist here
...
}
此将编译:
for(int i = 0; i <5;++i) {
...
}
for(int i = 0; i <5;++i) {
...
}